From b5234c5ab1e9e6826b8d8fc1e95fa752aaa40b74 Mon Sep 17 00:00:00 2001
From: chr <chr@mailcom>
Date: 星期六, 02 十一月 2024 10:56:50 +0800
Subject: [PATCH] 优化程序

---
 PdmSwPlugin.Main/SwAddIn/MainControl.cs                         |   82 +
 .vs/SwPlugin/v17/DocumentLayout.backup.json                     |  252 ++--
 PdmSwPlugin.Common/Util/CustomPropertyUtil.cs                   |    7 
 PdmSwPlugin.PropertySetting/Tab/JgjPartTab.xaml                 |   88 +
 PdmSwPlugin.PDM/PdmSwPlugin.PDM.csproj                          |    3 
 InnoSetupScript/PdmSwPlugin.iss                                 |    4 
 SolidWorksListener/Listener.cs                                  |   16 
 WpfUI/AsyncAttacher.cs                                          |    2 
 Md5Reader/Properties/AssemblyInfo.cs                            |   52 +
 PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs        |    4 
 AutoUpdater/MainWindow.xaml.cs                                  |   83 +
 PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs                     |   50 
 PdmSwPlugin.PropertySetting/SettingControl.xaml.cs              |  715 +++++++++++++
 Md5Reader/Properties/Resources.Designer.cs                      |   71 +
 PdmSwPlugin.Main/MainTab.xaml.cs                                |   30 
 Md5Reader/Properties/Settings.Designer.cs                       |   30 
 PdmSwPlugin.Common/Util/LimitedConcurrencyLevelTaskScheduler.cs |   10 
 PdmSwPlugin.PDM/PdmControl.xaml.cs                              |  364 +++++-
 Md5Reader/Properties/Settings.settings                          |    7 
 .vs/SwPlugin/v17/DocumentLayout.json                            |  204 ++-
 PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs                    |   14 
 PdmSwPlugin.PropertySetting/Panel/Model/JgjBasePanelModel.cs    |    4 
 PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs                    |    9 
 Md5Reader/MainWindow.xaml.cs                                    |   29 
 PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs                |    1 
 PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs                         |   36 
 Md5Reader/App.xaml                                              |    9 
 PdmSwPlugin.PropertySetting/SettingControl.xaml                 |   39 
 PdmSwPlugin.Main/MainTab.xaml                                   |   11 
 PdmSwPlugin.PropertySetting/Tab/JgjPartTab.xaml.cs              |  473 +++++++++
 Md5Reader/Md5Reader.csproj                                      |  125 ++
 PdmSwPlugin.PropertySetting/PdmSwPlugin.PropertySetting.csproj  |   14 
 Md5Reader/Properties/Resources.resx                             |  117 ++
 Md5Reader/App.config                                            |    6 
 PdmSw/SwAddin.cs                                                |   52 
 PdmSwPlugin.Main/Constant/PluginConst.cs                        |    2 
 Md5Reader/App.xaml.cs                                           |   17 
 PdmSwPlugin.Common/BomIniter/NameUtil.cs                        |    9 
 PdmSwPlugin.Common/Control/RichHisWindow.xaml                   |    2 
 Md5Reader/MainWindow.xaml                                       |   22 
 PdmSwPlugin.Common/Setting/CustomerSetting.cs                   |    5 
 PdmSwPlugin.Main/MainControl.xaml.cs                            |   44 
 PdmSwPlugin.PDM/packages.config                                 |    1 
 43 files changed, 2,767 insertions(+), 348 deletions(-)

diff --git a/.vs/SwPlugin/v17/DocumentLayout.backup.json b/.vs/SwPlugin/v17/DocumentLayout.backup.json
index bf181c2..a0bc88a 100644
--- a/.vs/SwPlugin/v17/DocumentLayout.backup.json
+++ b/.vs/SwPlugin/v17/DocumentLayout.backup.json
@@ -3,36 +3,48 @@
   "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\",
   "Documents": [
     {
-      "AbsoluteMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.drawapprove\\drawapprove.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|solutionrelative:pdmswplugin.drawapprove\\drawapprove.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\constant\\pluginconst.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\constant\\pluginconst.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
-      "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.drawapprove\\drawapprove.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
-      "RelativeMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|solutionrelative:pdmswplugin.drawapprove\\drawapprove.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
       "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|d:\\workspace\\pdmswplugin2\\pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\entity\\pdm\\pdmbom.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\entity\\pdm\\pdmbom.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
+      "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\util\\pdm\\bomtreereader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\util\\pdm\\bomtreereader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\bominiter\\ywtbominiter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\bominiter\\ywtbominiter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{3AEC586C-B22A-4ADB-B4AB-10AA660F79EC}|Md5Reader\\Md5Reader.csproj|D:\\Workspace\\PdmSwPlugin2\\md5reader\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{3AEC586C-B22A-4ADB-B4AB-10AA660F79EC}|Md5Reader\\Md5Reader.csproj|solutionrelative:md5reader\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.main\\maincontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\maincontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{CB3551F6-0C4A-4537-9A04-1E40CD475479}|SolidWorksListener\\SolidWorksListener.csproj|D:\\Workspace\\PdmSwPlugin2\\solidworkslistener\\listener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{CB3551F6-0C4A-4537-9A04-1E40CD475479}|SolidWorksListener\\SolidWorksListener.csproj|solutionrelative:solidworkslistener\\listener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|D:\\Workspace\\PdmSwPlugin2\\wpfui\\asyncattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|solutionrelative:wpfui\\asyncattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
       "RelativeMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|solutionrelative:pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\eventhandler\\baseattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\eventhandler\\baseattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|d:\\workspace\\pdmswplugin2\\pdmsw\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
-      "RelativeMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|solutionrelative:pdmsw\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
     }
   ],
   "DocumentGroupContainers": [
@@ -42,109 +54,139 @@
       "DocumentGroups": [
         {
           "DockedWidth": 200,
-          "SelectedChildIndex": 2,
+          "SelectedChildIndex": 4,
           "Children": [
             {
               "$type": "Document",
-              "DocumentIndex": 2,
-              "Title": "DrawApprove.xaml",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
-              "RelativeDocumentMoniker": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
-              "RelativeToolTip": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
-              "WhenOpened": "2024-10-09T03:31:27.843Z",
-              "EditorCaption": ""
+              "DocumentIndex": 5,
+              "Title": "YwtBomIniter.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
+              "RelativeToolTip": "PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
+              "ViewState": "AgIAAEEAAAAAAAAAAAAUwBIAAAAXAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-31T09:13:45.395Z"
             },
             {
               "$type": "Document",
-              "DocumentIndex": 1,
+              "DocumentIndex": 3,
               "Title": "PdmControl.xaml",
               "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
               "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml",
               "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
               "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
-              "WhenOpened": "2024-10-09T03:30:57.686Z",
-              "EditorCaption": ""
+              "WhenOpened": "2024-10-31T09:12:36.773Z"
             },
             {
               "$type": "Document",
-              "DocumentIndex": 0,
-              "Title": "DrawApprove.xaml.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
-              "RelativeToolTip": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
-              "ViewState": "AgIAAAYCAAAAAAAAAAAkwCICAAAAAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-09T03:22:18.864Z",
-              "EditorCaption": ""
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 7,
-              "Title": "log4net.config",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\log4net.config",
-              "RelativeDocumentMoniker": "PdmSw\\log4net.config",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\log4net.config",
-              "RelativeToolTip": "PdmSw\\log4net.config",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA0AAAAQAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000601|",
-              "WhenOpened": "2024-09-26T10:24:04.161Z",
-              "EditorCaption": ""
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 4,
-              "Title": "SwAddin.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
-              "RelativeDocumentMoniker": "PdmSw\\SwAddin.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
-              "RelativeToolTip": "PdmSw\\SwAddin.cs",
-              "ViewState": "AgIAACIAAAAAAAAAAAA5wCkAAAAvAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-09-26T08:51:00.927Z",
-              "EditorCaption": ""
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 6,
-              "Title": "BaseAttacher.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
-              "RelativeToolTip": "PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
-              "ViewState": "AgIAAKoAAAAAAAAAAAA0wMcAAAApAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-09-25T09:56:45.504Z",
-              "EditorCaption": ""
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 5,
-              "Title": "MainControl.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
-              "RelativeToolTip": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
-              "ViewState": "AgIAAIwAAAAAAAAAAAA+wOQAAABDAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-09-25T09:54:37.505Z",
-              "EditorCaption": ""
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 3,
+              "DocumentIndex": 1,
               "Title": "PdmControl.xaml.cs",
               "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
               "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
               "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
               "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
-              "ViewState": "AgIAAM0EAAAAAAAAAAAAAOEEAAAvAAAAAAAAAA==",
+              "ViewState": "AgIAALUEAAAAAAAAAAAuwMUEAABAAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-09-25T06:09:00.747Z",
+              "WhenOpened": "2024-10-31T08:50:14.505Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 4,
+              "Title": "BomTreeReader.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
+              "RelativeToolTip": "PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
+              "ViewState": "AgIAAPsAAAAAAAAAAAAUwBABAAAgAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-31T08:33:38.547Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "PluginConst.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
+              "RelativeToolTip": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-14T04:01:41.756Z",
               "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 2,
+              "Title": "PdmBom.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
+              "RelativeToolTip": "PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
+              "ViewState": "AgIAAIgAAAAAAAAAAAA+wJYAAAAdAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-31T08:32:38.632Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 6,
+              "Title": "MainWindow.xaml.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\Md5Reader\\MainWindow.xaml.cs",
+              "RelativeDocumentMoniker": "Md5Reader\\MainWindow.xaml.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\Md5Reader\\MainWindow.xaml.cs",
+              "RelativeToolTip": "Md5Reader\\MainWindow.xaml.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAABAAAABDAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-30T02:39:22.183Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 7,
+              "Title": "MainControl.xaml.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\MainControl.xaml.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml.cs",
+              "RelativeToolTip": "PdmSwPlugin.Main\\MainControl.xaml.cs",
+              "ViewState": "AgIAAMAAAAAAAAAAAAAYwMoAAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-14T04:24:56.766Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 8,
+              "Title": "Listener.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\SolidWorksListener\\Listener.cs",
+              "RelativeDocumentMoniker": "SolidWorksListener\\Listener.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\SolidWorksListener\\Listener.cs",
+              "RelativeToolTip": "SolidWorksListener\\Listener.cs",
+              "ViewState": "AgIAANAAAAAAAAAAAADwv90AAAAiAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-14T03:42:50.289Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 9,
+              "Title": "AsyncAttacher.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\AsyncAttacher.cs",
+              "RelativeDocumentMoniker": "WpfUI\\AsyncAttacher.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\AsyncAttacher.cs",
+              "RelativeToolTip": "WpfUI\\AsyncAttacher.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAJAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-14T03:36:12.415Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 10,
+              "Title": "SwAddin.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
+              "RelativeDocumentMoniker": "PdmSw\\SwAddin.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
+              "RelativeToolTip": "PdmSw\\SwAddin.cs",
+              "ViewState": "AgIAABMBAAAAAAAAAAAkwCYBAAAkAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-14T01:09:55.509Z"
             }
           ]
         }
diff --git a/.vs/SwPlugin/v17/DocumentLayout.json b/.vs/SwPlugin/v17/DocumentLayout.json
index 145e413..a0bc88a 100644
--- a/.vs/SwPlugin/v17/DocumentLayout.json
+++ b/.vs/SwPlugin/v17/DocumentLayout.json
@@ -3,24 +3,48 @@
   "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\",
   "Documents": [
     {
-      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\constant\\pluginconst.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\constant\\pluginconst.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
       "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
+      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\entity\\pdm\\pdmbom.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\entity\\pdm\\pdmbom.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
       "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|d:\\workspace\\pdmswplugin2\\pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\util\\pdm\\bomtreereader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\util\\pdm\\bomtreereader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\bominiter\\ywtbominiter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\bominiter\\ywtbominiter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{3AEC586C-B22A-4ADB-B4AB-10AA660F79EC}|Md5Reader\\Md5Reader.csproj|D:\\Workspace\\PdmSwPlugin2\\md5reader\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{3AEC586C-B22A-4ADB-B4AB-10AA660F79EC}|Md5Reader\\Md5Reader.csproj|solutionrelative:md5reader\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.main\\maincontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\maincontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{CB3551F6-0C4A-4537-9A04-1E40CD475479}|SolidWorksListener\\SolidWorksListener.csproj|D:\\Workspace\\PdmSwPlugin2\\solidworkslistener\\listener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{CB3551F6-0C4A-4537-9A04-1E40CD475479}|SolidWorksListener\\SolidWorksListener.csproj|solutionrelative:solidworkslistener\\listener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|D:\\Workspace\\PdmSwPlugin2\\wpfui\\asyncattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|solutionrelative:wpfui\\asyncattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
       "RelativeMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|solutionrelative:pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\eventhandler\\baseattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\eventhandler\\baseattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     }
   ],
   "DocumentGroupContainers": [
@@ -34,67 +58,135 @@
           "Children": [
             {
               "$type": "Document",
-              "DocumentIndex": 1,
+              "DocumentIndex": 5,
+              "Title": "YwtBomIniter.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
+              "RelativeToolTip": "PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
+              "ViewState": "AgIAAEEAAAAAAAAAAAAUwBIAAAAXAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-31T09:13:45.395Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 3,
               "Title": "PdmControl.xaml",
               "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
               "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml",
               "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
               "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
-              "WhenOpened": "2024-10-09T03:30:57.686Z",
-              "EditorCaption": ""
+              "WhenOpened": "2024-10-31T09:12:36.773Z"
             },
             {
               "$type": "Document",
-              "DocumentIndex": 2,
-              "Title": "SwAddin.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
-              "RelativeDocumentMoniker": "PdmSw\\SwAddin.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
-              "RelativeToolTip": "PdmSw\\SwAddin.cs",
-              "ViewState": "AgIAACIAAAAAAAAAAAA5wCkAAAAvAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-09-26T08:51:00.927Z",
-              "EditorCaption": ""
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 4,
-              "Title": "BaseAttacher.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
-              "RelativeToolTip": "PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
-              "ViewState": "AgIAAKoAAAAAAAAAAAA0wMcAAAApAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-09-25T09:56:45.504Z",
-              "EditorCaption": ""
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 3,
-              "Title": "MainControl.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
-              "RelativeToolTip": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
-              "ViewState": "AgIAAIwAAAAAAAAAAAA+wOQAAABDAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-09-25T09:54:37.505Z",
-              "EditorCaption": ""
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 0,
+              "DocumentIndex": 1,
               "Title": "PdmControl.xaml.cs",
               "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
               "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
               "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
               "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
-              "ViewState": "AgIAANAEAAAAAAAAAAAAAOIEAAAZAAAAAAAAAA==",
+              "ViewState": "AgIAALUEAAAAAAAAAAAuwMUEAABAAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-09-25T06:09:00.747Z",
+              "WhenOpened": "2024-10-31T08:50:14.505Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 4,
+              "Title": "BomTreeReader.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
+              "RelativeToolTip": "PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
+              "ViewState": "AgIAAPsAAAAAAAAAAAAUwBABAAAgAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-31T08:33:38.547Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "PluginConst.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
+              "RelativeToolTip": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-14T04:01:41.756Z",
               "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 2,
+              "Title": "PdmBom.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
+              "RelativeToolTip": "PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
+              "ViewState": "AgIAAIgAAAAAAAAAAAA+wJYAAAAdAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-31T08:32:38.632Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 6,
+              "Title": "MainWindow.xaml.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\Md5Reader\\MainWindow.xaml.cs",
+              "RelativeDocumentMoniker": "Md5Reader\\MainWindow.xaml.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\Md5Reader\\MainWindow.xaml.cs",
+              "RelativeToolTip": "Md5Reader\\MainWindow.xaml.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAABAAAABDAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-30T02:39:22.183Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 7,
+              "Title": "MainControl.xaml.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\MainControl.xaml.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml.cs",
+              "RelativeToolTip": "PdmSwPlugin.Main\\MainControl.xaml.cs",
+              "ViewState": "AgIAAMAAAAAAAAAAAAAYwMoAAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-14T04:24:56.766Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 8,
+              "Title": "Listener.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\SolidWorksListener\\Listener.cs",
+              "RelativeDocumentMoniker": "SolidWorksListener\\Listener.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\SolidWorksListener\\Listener.cs",
+              "RelativeToolTip": "SolidWorksListener\\Listener.cs",
+              "ViewState": "AgIAANAAAAAAAAAAAADwv90AAAAiAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-14T03:42:50.289Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 9,
+              "Title": "AsyncAttacher.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\AsyncAttacher.cs",
+              "RelativeDocumentMoniker": "WpfUI\\AsyncAttacher.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\AsyncAttacher.cs",
+              "RelativeToolTip": "WpfUI\\AsyncAttacher.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAJAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-14T03:36:12.415Z"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 10,
+              "Title": "SwAddin.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
+              "RelativeDocumentMoniker": "PdmSw\\SwAddin.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
+              "RelativeToolTip": "PdmSw\\SwAddin.cs",
+              "ViewState": "AgIAABMBAAAAAAAAAAAkwCYBAAAkAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2024-10-14T01:09:55.509Z"
             }
           ]
         }
diff --git a/AutoUpdater/MainWindow.xaml.cs b/AutoUpdater/MainWindow.xaml.cs
index 76d46fa..b4b590a 100644
--- a/AutoUpdater/MainWindow.xaml.cs
+++ b/AutoUpdater/MainWindow.xaml.cs
@@ -2,12 +2,12 @@
 using AutoUpdater.Util;
 using ICSharpCode.SharpZipLib.Zip;
 using log4net;
+using Microsoft.Win32;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.IO;
 using System.Reflection;
-using System.Runtime.InteropServices;
 using System.Threading;
 using System.Windows;
 using VersionControl;
@@ -130,20 +130,27 @@
         /// </summary>
         public void StartListenerProcess()
         {
-            string dir = Path.GetDirectoryName(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
-            string path1 = Path.Combine(dir, "Listener", "SolidWorksListener.exe");
-            if (File.Exists(path1))
+            try
             {
-                ProcessStartInfo info = new ProcessStartInfo
+                string dir = Path.GetDirectoryName(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
+                string path1 = Path.Combine(dir, "Listener", "SolidWorksListener.exe");
+                if (File.Exists(path1))
                 {
-                    FileName = path1,
-                    WorkingDirectory = Path.GetDirectoryName(path1)
-                };
+                    ProcessStartInfo info = new ProcessStartInfo
+                    {
+                        FileName = path1,
+                        WorkingDirectory = Path.GetDirectoryName(path1)
+                    };
 
-                new Process
-                {
-                    StartInfo = info
-                }.Start();
+                    new Process
+                    {
+                        StartInfo = info
+                    }.Start();
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Error("Start Listener Process Error!", ex);
             }
         }
 
@@ -330,10 +337,60 @@
             DoFinished();
         }
 
-        private void DoFinished()
+        /// <summary>
+        /// 妫�鏌ヨ嚜鍚姩娉ㄥ唽琛�
+        /// </summary>
+        private void CheckAutoRunRegKey()
         {
+            RegistryKey root = null;
+            RegistryKey key = null;
+            try
+            {
+                root = Registry.CurrentUser;
+                key = root.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
+                string name = "SolidWorksListener";
+                if (key == null)
+                {
+                    key = root.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
+                }
+                // 娌℃湁璺緞鎴栬�呰矾寰勬寚鍚慹xe涓嶅锛屽氨鏇存柊鑷惎鍔ㄨ矾寰�
+                string listenerPath = key.GetValue(name)?.ToString();
+                string rootDir = new DirectoryInfo(Assembly.GetExecutingAssembly().Location).Parent.Parent.FullName;
+                string newPath = Path.Combine(rootDir, "Listener", "SolidWorksListener.exe");
+                //listenerPath = listenerPath.Replace("\"", "");
+                if (string.IsNullOrEmpty(listenerPath) || new Uri(listenerPath) != new Uri(newPath))
+                {
+                    key.SetValue(name, newPath, RegistryValueKind.String);
+                }
+            }
+            catch (Exception e)
+            {
+                Logger.Error("CheckAutoRunRegKey Failed!", e);
+            }
+            finally
+            {
+                try
+                {
+                    if (key != null) key.Close();
+                    if (root != null) root.Close();
+                }
+                catch (Exception ex)
+                {
+                    Logger.Error("Reg Key Close Failed!", ex);
+                }
+            }
+        }
+
+        private void BeforeRestart()
+        {
+            CheckAutoRunRegKey();
             // 鍚姩鐩戝惉杩涚▼
             StartListenerProcess();
+        }
+
+        private void DoFinished()
+        {
+            BeforeRestart();
             label.Content = "鏇存柊瀹屾垚";
             bar.IsIndeterminate = false;
             if (SwAppPath != null)
diff --git a/InnoSetupScript/PdmSwPlugin.iss b/InnoSetupScript/PdmSwPlugin.iss
index 1f3ea2a..b520d2d 100644
--- a/InnoSetupScript/PdmSwPlugin.iss
+++ b/InnoSetupScript/PdmSwPlugin.iss
@@ -7,7 +7,7 @@
 ; 自动更新程序路径
 #define AutoUpdaterDir = "D:\Workspace\PdmSwPlugin2\PdmSw\bin\x64\Release\AutoUpdater\"
 ; 版本
-#define Version = "_0.0.0.42"
+#define Version = "_0.0.0.43_改"
 
 ; 生成的Installer存放路径
 #define OutPutDir = "Z:\Output"
@@ -81,7 +81,7 @@
 ;Root: HKLM64; Subkey: "SYSTEM\CurrentControlSet\Services\SolidWorks Listener"; ValueType: dword; ValueName: "Type"; ValueData: 272; Flags: deletevalue
 
 ; 监听器2.0
-Root: HKCU64; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "SolidWorksListener"; ValueData: """{app}\Listener\SolidWorksListener.exe"""; Flags: deletevalue uninsdeletevalue
+Root: HKCU64; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "SolidWorksListener"; ValueData: "{app}\Listener\SolidWorksListener.exe"; Flags: deletevalue uninsdeletevalue
  
 
 [Icons]
diff --git a/Md5Reader/App.config b/Md5Reader/App.config
new file mode 100644
index 0000000..56efbc7
--- /dev/null
+++ b/Md5Reader/App.config
@@ -0,0 +1,6 @@
+锘�<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
+    </startup>
+</configuration>
\ No newline at end of file
diff --git a/Md5Reader/App.xaml b/Md5Reader/App.xaml
new file mode 100644
index 0000000..0444c01
--- /dev/null
+++ b/Md5Reader/App.xaml
@@ -0,0 +1,9 @@
+锘�<Application x:Class="Md5Reader.App"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:local="clr-namespace:Md5Reader"
+             StartupUri="MainWindow.xaml">
+    <Application.Resources>
+         
+    </Application.Resources>
+</Application>
diff --git a/Md5Reader/App.xaml.cs b/Md5Reader/App.xaml.cs
new file mode 100644
index 0000000..1454454
--- /dev/null
+++ b/Md5Reader/App.xaml.cs
@@ -0,0 +1,17 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace Md5Reader
+{
+    /// <summary>
+    /// App.xaml 鐨勪氦浜掗�昏緫
+    /// </summary>
+    public partial class App : Application
+    {
+    }
+}
diff --git a/Md5Reader/MainWindow.xaml b/Md5Reader/MainWindow.xaml
new file mode 100644
index 0000000..ddc8f6e
--- /dev/null
+++ b/Md5Reader/MainWindow.xaml
@@ -0,0 +1,22 @@
+锘�<Window x:Class="Md5Reader.MainWindow"
+        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+        xmlns:local="clr-namespace:Md5Reader"
+        mc:Ignorable="d"
+        Title="MD5宸ュ叿" Height="450" Width="800">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="Auto"/>
+            <RowDefinition/>
+        </Grid.RowDefinitions>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="Auto"/>
+            <ColumnDefinition/>
+        </Grid.ColumnDefinitions>
+        <Button Grid.Row="0" Grid.Column="0"  Padding="20" Click="Button_Click">鎵撳紑鏂囦欢</Button>
+        <TextBox Grid.Row="0" Grid.Column="1" IsReadOnly="True" x:Name="pathInput"></TextBox>
+        <TextBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" IsReadOnly="True" TextWrapping="WrapWithOverflow" x:Name="consoleInput"></TextBox>
+    </Grid>
+</Window>
diff --git a/Md5Reader/MainWindow.xaml.cs b/Md5Reader/MainWindow.xaml.cs
new file mode 100644
index 0000000..9f25293
--- /dev/null
+++ b/Md5Reader/MainWindow.xaml.cs
@@ -0,0 +1,29 @@
+锘縰sing PdmSwPlugin.Common.Util;
+using System.Windows;
+using System.Windows.Forms;
+
+namespace Md5Reader
+{
+    /// <summary>
+    /// MainWindow.xaml 鐨勪氦浜掗�昏緫
+    /// </summary>
+    public partial class MainWindow : Window
+    {
+        public MainWindow()
+        {
+            InitializeComponent();
+        }
+
+        private void Button_Click(object sender, RoutedEventArgs e)
+        {
+            OpenFileDialog openFileDialog = new OpenFileDialog();
+            openFileDialog.Multiselect = false;
+            if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+            {
+                pathInput.Text = openFileDialog.FileName;
+                string md5 = MD5Util.Md5SHA1(openFileDialog.FileName);
+                consoleInput.Text += $"鏂囦欢璺緞: {openFileDialog.FileName}\r\nMD5: {md5}\r\n\r\n";
+            }
+        }
+    }
+}
diff --git a/Md5Reader/Md5Reader.csproj b/Md5Reader/Md5Reader.csproj
new file mode 100644
index 0000000..ea3edf8
--- /dev/null
+++ b/Md5Reader/Md5Reader.csproj
@@ -0,0 +1,125 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{3AEC586C-B22A-4ADB-B4AB-10AA660F79EC}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>Md5Reader</RootNamespace>
+    <AssemblyName>Md5Reader</AssemblyName>
+    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <WarningLevel>4</WarningLevel>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <LangVersion>7.3</LangVersion>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <LangVersion>7.3</LangVersion>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xaml">
+      <RequiredTargetFramework>4.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="WindowsBase" />
+    <Reference Include="PresentationCore" />
+    <Reference Include="PresentationFramework" />
+  </ItemGroup>
+  <ItemGroup>
+    <ApplicationDefinition Include="App.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </ApplicationDefinition>
+    <Page Include="MainWindow.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Compile Include="App.xaml.cs">
+      <DependentUpon>App.xaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="MainWindow.xaml.cs">
+      <DependentUpon>MainWindow.xaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\PdmSwPlugin.Common\PdmSwPlugin.Common.csproj">
+      <Project>{e17ef6b6-ee83-45aa-b0c0-e3a097089e97}</Project>
+      <Name>PdmSwPlugin.Common</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/Md5Reader/Properties/AssemblyInfo.cs b/Md5Reader/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..9ae6b6c
--- /dev/null
+++ b/Md5Reader/Properties/AssemblyInfo.cs
@@ -0,0 +1,52 @@
+锘縰sing System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// 鏈夊叧绋嬪簭闆嗙殑涓�鑸俊鎭敱浠ヤ笅
+// 鎺у埗銆傛洿鏀硅繖浜涚壒鎬у�煎彲淇敼
+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭��
+[assembly: AssemblyTitle("Md5Reader")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Md5Reader")]
+[assembly: AssemblyCopyright("Copyright 漏  2024")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏� ComVisible 璁剧疆涓� false 浼氫娇姝ょ▼搴忛泦涓殑绫诲瀷
+//瀵� COM 缁勪欢涓嶅彲瑙併�傚鏋滈渶瑕佷粠 COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷
+//璇峰皢姝ょ被鍨嬬殑 ComVisible 鐗规�ц缃负 true銆�
+[assembly: ComVisible(false)]
+
+//鑻ヨ寮�濮嬬敓鎴愬彲鏈湴鍖栫殑搴旂敤绋嬪簭锛岃璁剧疆
+//.csproj 鏂囦欢涓殑 <UICulture>CultureYouAreCodingWith</UICulture>
+//鍦� <PropertyGroup> 涓�備緥濡傦紝濡傛灉浣犱娇鐢ㄧ殑鏄編鍥借嫳璇��
+//浣跨敤鐨勬槸缇庡浗鑻辫锛岃灏� <UICulture> 璁剧疆涓� en-US銆�  鐒跺悗鍙栨秷
+//瀵逛互涓� NeutralResourceLanguage 鐗规�х殑娉ㄩ噴銆�  鏇存柊
+//浠ヤ笅琛屼腑鐨勨�渆n-US鈥濅互鍖归厤椤圭洰鏂囦欢涓殑 UICulture 璁剧疆銆�
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+    ResourceDictionaryLocation.None, //涓婚鐗瑰畾璧勬簮璇嶅吀鎵�澶勪綅缃�
+                                     //(鏈湪椤甸潰涓壘鍒拌祫婧愭椂浣跨敤锛�
+                                     //鎴栧簲鐢ㄧ▼搴忚祫婧愬瓧鍏镐腑鎵惧埌鏃朵娇鐢�)
+    ResourceDictionaryLocation.SourceAssembly //甯歌璧勬簮璇嶅吀鎵�澶勪綅缃�
+                                              //(鏈湪椤甸潰涓壘鍒拌祫婧愭椂浣跨敤锛�
+                                              //銆佸簲鐢ㄧ▼搴忔垨浠讳綍涓婚涓撶敤璧勬簮瀛楀吀涓壘鍒版椂浣跨敤)
+)]
+
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅鍒楀洓涓�肩粍鎴�: 
+//
+//      涓荤増鏈�
+//      娆$増鏈�
+//      鐢熸垚鍙�
+//      淇鍙�
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Md5Reader/Properties/Resources.Designer.cs b/Md5Reader/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..453224d
--- /dev/null
+++ b/Md5Reader/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+//     姝や唬鐮佺敱宸ュ叿鐢熸垚銆�
+//     杩愯鏃剁増鏈�: 4.0.30319.42000
+//
+//     瀵规鏂囦欢鐨勬洿鏀瑰彲鑳藉鑷翠笉姝g‘鐨勮涓猴紝濡傛灉
+//     閲嶆柊鐢熸垚浠g爜锛屽垯鎵�鍋氭洿鏀瑰皢涓㈠け銆�
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Md5Reader.Properties
+{
+
+
+    /// <summary>
+    ///   寮虹被鍨嬭祫婧愮被锛岀敤浜庢煡鎵炬湰鍦板寲瀛楃涓茬瓑銆�
+    /// </summary>
+    // 姝ょ被鏄敱 StronglyTypedResourceBuilder
+    // 绫婚�氳繃绫讳技浜� ResGen 鎴� Visual Studio 鐨勫伐鍏疯嚜鍔ㄧ敓鎴愮殑銆�
+    // 鑻ヨ娣诲姞鎴栫Щ闄ゆ垚鍛橈紝璇风紪杈� .ResX 鏂囦欢锛岀劧鍚庨噸鏂拌繍琛� ResGen
+    // (浠� /str 浣滀负鍛戒护閫夐」)锛屾垨閲嶆柊鐢熸垚 VS 椤圭洰銆�
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources
+    {
+
+        private static global::System.Resources.ResourceManager resourceMan;
+
+        private static global::System.Globalization.CultureInfo resourceCulture;
+
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources()
+        {
+        }
+
+        /// <summary>
+        ///   杩斿洖姝ょ被浣跨敤鐨勭紦瀛� ResourceManager 瀹炰緥銆�
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager
+        {
+            get
+            {
+                if ((resourceMan == null))
+                {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Md5Reader.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+
+        /// <summary>
+        ///   閲嶅啓褰撳墠绾跨▼鐨� CurrentUICulture 灞炴�э紝瀵�
+        ///   浣跨敤姝ゅ己绫诲瀷璧勬簮绫荤殑鎵�鏈夎祫婧愭煡鎵炬墽琛岄噸鍐欍��
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture
+        {
+            get
+            {
+                return resourceCulture;
+            }
+            set
+            {
+                resourceCulture = value;
+            }
+        }
+    }
+}
diff --git a/Md5Reader/Properties/Resources.resx b/Md5Reader/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/Md5Reader/Properties/Resources.resx
@@ -0,0 +1,117 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/Md5Reader/Properties/Settings.Designer.cs b/Md5Reader/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..86902cc
--- /dev/null
+++ b/Md5Reader/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Md5Reader.Properties
+{
+
+
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+    {
+
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+        public static Settings Default
+        {
+            get
+            {
+                return defaultInstance;
+            }
+        }
+    }
+}
diff --git a/Md5Reader/Properties/Settings.settings b/Md5Reader/Properties/Settings.settings
new file mode 100644
index 0000000..033d7a5
--- /dev/null
+++ b/Md5Reader/Properties/Settings.settings
@@ -0,0 +1,7 @@
+锘�<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
\ No newline at end of file
diff --git a/PdmSw/SwAddin.cs b/PdmSw/SwAddin.cs
index f9f530b..937fea0 100644
--- a/PdmSw/SwAddin.cs
+++ b/PdmSw/SwAddin.cs
@@ -126,6 +126,8 @@
 
         private BaseAttacher attacher;
         private ISldWorks swApp;
+        private TaskpaneView panel;
+        private Form mainForm;
         // Public Properties
         public ISldWorks SwApp
         {
@@ -274,7 +276,7 @@
                     Path.Combine(imageFolder, @"MatChooser_128X128.png")
             };
             // 创建Panel
-            TaskpaneView panel = SwApp.CreateTaskpaneView3(bitmaps, "PdmSwPlugin" + PluginConst.Version);
+            panel = SwApp.CreateTaskpaneView3(bitmaps, "PdmSwPlugin" + PluginConst.Version);
 
             mainControl = new MainControl((SldWorks)SwApp);
             // 只能用winform,代理wpf
@@ -284,7 +286,7 @@
                 AutoSize = true,
                 Dock = DockStyle.Fill
             };
-            Form form = new Form
+            mainForm = new Form
             {
                 Text = "PdmSwPlugin",
                 ControlBox = false,
@@ -292,10 +294,11 @@
                 KeyPreview = true,
                 Dock = DockStyle.Fill
             };
-            form.Controls.Add(host);
-            IntPtr ptr = form.Handle;
+            mainForm.Controls.Add(host);
+            IntPtr ptr = mainForm.Handle;
             // IntPtr ptr = WindowIntPtrUtil.FindWindow(null, "Window1");
             panel.DisplayWindowFromHandlex64(ptr.ToInt64());
+            mainForm.WindowState = FormWindowState.Maximized;
         }
 
         private void LoadPlugins()
@@ -327,23 +330,36 @@
         /// <returns></returns>
         public bool DisconnectFromSW()
         {
-            RemoveCommandMgr();
-            RemovePMP();
-            mainControl.StopTcpServer();
-            attacher.DetachEventHandlers();
-            attacher = null;
+            try
+            {
+                RemoveCommandMgr();
+                RemovePMP();
+                mainControl.StopTcpServer();
+                mainControl.DeActiveHandler();
+                attacher.DetachEventHandlers();
+                attacher = null;
 
-            System.Runtime.InteropServices.Marshal.ReleaseComObject(iCmdMgr);
-            iCmdMgr = null;
-            System.Runtime.InteropServices.Marshal.ReleaseComObject(SwApp);
-            swApp = null;
-            //The addin _must_ call GC.Collect() here in order to retrieve all managed code pointers 
-            GC.Collect();
-            GC.WaitForPendingFinalizers();
+                mainForm.Close();
+                mainForm = null;
+                mainControl = null;
+                panel.DeleteView();
+                panel = null;
 
-            GC.Collect();
-            GC.WaitForPendingFinalizers();
+                Marshal.ReleaseComObject(iCmdMgr);
+                iCmdMgr = null;
+                Marshal.ReleaseComObject(SwApp);
+                swApp = null;
+                //The addin _must_ call GC.Collect() here in order to retrieve all managed code pointers 
+                GC.Collect();
+                GC.WaitForPendingFinalizers();
 
+                //GC.Collect();
+                //GC.WaitForPendingFinalizers();
+            }
+            catch (Exception ex)
+            {
+                Logger.Error("DisconnectFromSW Failed!", ex);
+            }
             return true;
         }
         #endregion
diff --git a/PdmSwPlugin.Common/BomIniter/NameUtil.cs b/PdmSwPlugin.Common/BomIniter/NameUtil.cs
index 79cec69..f3bb049 100644
--- a/PdmSwPlugin.Common/BomIniter/NameUtil.cs
+++ b/PdmSwPlugin.Common/BomIniter/NameUtil.cs
@@ -5,8 +5,6 @@
 {
     public class NameUtil
     {
-        public static readonly PluginSetting setting = PluginSetting.Instance;
-
         /// <summary>
         /// 鍒ゆ柇鏂囨。鏄惁鏄巻鍙叉枃妗�
         /// </summary>
@@ -14,12 +12,15 @@
         /// <returns>true 鏄� false 涓嶆槸</returns>
         public static bool IsHistoryDoc(string name)
         {
+            CustomerSetting setting = CustomerSetting.Instance;
             if (string.IsNullOrEmpty(name)) return false;
-            if (setting.HistoryDateFlag < 0) return false;
+            string historyFlagStr = setting["historyFlag"];
+            _ = long.TryParse(historyFlagStr, out long flag);
+            if (flag < 0) return false;
             try
             {
                 long historyFlag = long.Parse(name.Substring(0, 8));
-                if (historyFlag <= setting.HistoryDateFlag)
+                if (historyFlag <= flag)
                 {
                     return true;
                 }
diff --git a/PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs b/PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs
index 5aae542..6b105f0 100644
--- a/PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs
+++ b/PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs
@@ -10,8 +10,6 @@
     public class YwtBomIniter : BomIniter
     {
         public static PluginSetting setting = PluginSetting.Instance;
-        public string jgjNameRegx { get; private set; } = CustomerSetting.Instance["jgjNameRegx"];
-        public string standardNameRegx { get; private set; } = CustomerSetting.Instance["standardNameRegx"];
 
         public void InitBom(PdmBom bom)
         {
@@ -27,16 +25,20 @@
             bom.xc = false;
             bom.mn = false;
 
+            string jgjNameRegx = CustomerSetting.Instance["jgjNameRegx"];
+            string standardNameRegx = CustomerSetting.Instance["standardNameRegx"];
+
             if (Regex.IsMatch(childName, jgjNameRegx))
             {
-                if (bom._drawInfo != null) { 
+                if (bom._drawInfo != null)
+                {
                     bom._drawInfo.HistoryData = NameUtil.IsHistoryDoc(childName);
                 }
 
                 string docType = bom.properties.Get("鏂囦欢鏍煎紡");
                 if (string.IsNullOrEmpty(docType))
                 {
-                    bom.produceWay = "鏍囧噯浠�";
+                    bom.produceWay = "鍔犲伐浠�";
                 }
                 else
                 {
@@ -72,12 +74,14 @@
         /// <returns></returns>
         public bool IsJgjPanel(ModelDoc2 doc)
         {
+            string jgjNameRegx = CustomerSetting.Instance["jgjNameRegx"];
             string fileName = Path.GetFileNameWithoutExtension(doc.GetPathName());
             return Regex.IsMatch(fileName, jgjNameRegx);
         }
 
         public bool IsJgj(ModelDoc2 doc)
         {
+            string jgjNameRegx = CustomerSetting.Instance["jgjNameRegx"];
             string fileName = Path.GetFileNameWithoutExtension(doc.GetPathName());
             return Regex.IsMatch(fileName, jgjNameRegx);
         }
@@ -85,6 +89,8 @@
         public bool IsStandard(ModelDoc2 doc)
         {
             string fileName = doc.GetPathName();
+            string standardNameRegx = CustomerSetting.Instance["standardNameRegx"];
+
             fileName = Path.GetFileNameWithoutExtension(fileName);
             return Regex.IsMatch(fileName, standardNameRegx);
         }
diff --git a/PdmSwPlugin.Common/Control/RichHisWindow.xaml b/PdmSwPlugin.Common/Control/RichHisWindow.xaml
index ca08eb9..9167624 100644
--- a/PdmSwPlugin.Common/Control/RichHisWindow.xaml
+++ b/PdmSwPlugin.Common/Control/RichHisWindow.xaml
@@ -11,9 +11,9 @@
              Height="600" Width="1200">
     <DataGrid x:Name="table" ItemsSource="{Binding HisList}"
           AutoGenerateColumns="False"
-            EnableRowVirtualization="False"
             CanUserAddRows="False"
             ColumnWidth="*"
+            ScrollViewer.CanContentScroll="False"
             CanUserSortColumns="False"
             CanUserDeleteRows="False">
         <DataGrid.Columns>
diff --git a/PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs b/PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs
index 3893ec3..ce3c459 100644
--- a/PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs
+++ b/PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs
@@ -62,6 +62,7 @@
             else
             {
                 this.HisList = new ObservableCollection<DrawAuditHis>(hisList);
+                table.ScrollIntoView(HisList[0]);
             }
         }
 
diff --git a/PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs b/PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs
index d8f53e0..7cddf17 100644
--- a/PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs
+++ b/PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs
@@ -43,6 +43,7 @@
         public Component2 component { get; set; }
 
         public bool lost { get; set; } = false;
+        public bool isHidden { get; set; } = false;
         public bool suppressed { get; set; } = false;
         public bool lightWeight { get; set; } = false;
 
@@ -147,6 +148,8 @@
 
         private int? _checkRuleResult = 0;
 
+        public bool isHidden;
+
         public int? checkRuleResult
         {
             get => _checkRuleResult;
@@ -204,7 +207,10 @@
         public Dictionary<string, string> properties => BomInfo?.properties;
         public string d3FilePath => BomInfo?.d3FilePath;
         public string filePath => BomInfo?.filePath;
-        public bool lost => BomInfo?.lost == true;
+        public bool lost => BomInfo?.lost == true || isHidden;
+
+        public bool isHidden = false;
+
         public bool suppressed => BomInfo?.suppressed == true;
         public bool lightWeight => BomInfo?.lightWeight == true;
 
@@ -243,7 +249,7 @@
         /// <summary>
         /// 瑙勫垯妫�鏌ョ粨鏋�
         /// </summary>
-        public int? checkRuleResult => (IsHistoryData || skipCheck) ? 3 : _drawInfo?.checkRuleResult;
+        public int? checkRuleResult => (IsHistoryData || skipCheck) ? 3 : (isHidden ? 2 : _drawInfo?.checkRuleResult);
         /// <summary>
         /// 妫�鏌ユ槸鍚K
         /// </summary>
@@ -260,6 +266,8 @@
             }
         }
 
+        public List<string> ErrorMsgs;
+
         /// <summary>
         /// 鏄惁闇�瑕佸鏍�
         /// </summary>
@@ -273,7 +281,7 @@
                 if (ExcludeFromBOM) return false;
                 // 妯$粍涓嶅鏍�
                 if (produceWay == "妯$粍") return false;
-                // 寰呭鏍哥殑涓嶅啿绐佹彁浜�
+                // 寰呭鏍哥殑涓嶉噸澶嶆彁浜�
                 if (drawStatus == "submitted" || drawStatus == "resubmitted") return false;
                 if (IsHistoryData)
                 {
@@ -300,14 +308,25 @@
             if (ExcludeFromBOM) return null;
             if (IsHistoryData)
             {
+                bool err = false;
+                string msg = $"鍘嗗彶鍥剧焊銆恵partModel}銆�";
                 if (localDocChanged)
                 {
-                    return $"鍘嗗彶鍥剧焊銆恵partModel}銆戝彉鏇村悗鏈噸鏂板鏍�";
+                    err = true;
+                    msg += "鍙樻洿鍚庢湭閲嶆柊瀹℃牳;";
                 }
                 else if (drawStatus == "rejected" || drawStatus == "submitted" || drawStatus == "resubmitted")
                 {
-                    return $"鍘嗗彶鍥剧焊銆恵partModel}銆戞湭閫氳繃瀹℃牳";
+                    err = true;
+                    msg += "鏈�氳繃瀹℃牳";
                 }
+
+                if (isHidden)
+                {
+                    err = true;
+                    msg += "琚殣钘�;";
+                }
+                return err ? msg : null;
             }
             if (!IsHistoryData)
             {
@@ -316,7 +335,12 @@
                 if (!skipCheck && !checkRuleOk)
                 {
                     error = true;
-                    msg += "鏈�氳繃瑙勫垯妫�鏌�";
+                    msg += "鏈�氳繃瑙勫垯妫�鏌�;";
+                }
+                if (!skipCheck && isHidden)
+                {
+                    error = true;
+                    msg += "琚殣钘�;";
                 }
                 if (produceWay == "鍔犲伐浠�" && drawStatus != "completed")
                 {
diff --git a/PdmSwPlugin.Common/Setting/CustomerSetting.cs b/PdmSwPlugin.Common/Setting/CustomerSetting.cs
index 3fec6ac..79a7bda 100644
--- a/PdmSwPlugin.Common/Setting/CustomerSetting.cs
+++ b/PdmSwPlugin.Common/Setting/CustomerSetting.cs
@@ -16,10 +16,7 @@
 
         public static void Set(Dictionary<string, string> Settings)
         {
-            if (Instance == null)
-            {
-                Instance = new CustomerSetting(Settings);
-            }
+            Instance = new CustomerSetting(Settings);
         }
 
         public string this[string field]
diff --git a/PdmSwPlugin.Common/Util/CustomPropertyUtil.cs b/PdmSwPlugin.Common/Util/CustomPropertyUtil.cs
index f40a1f3..136ad88 100644
--- a/PdmSwPlugin.Common/Util/CustomPropertyUtil.cs
+++ b/PdmSwPlugin.Common/Util/CustomPropertyUtil.cs
@@ -31,6 +31,13 @@
             }
         }
 
+        /// <summary>
+        /// 鑾峰彇鏂囨。灞炴��
+        /// </summary>
+        /// <param name="currentModelDoc">鏂囨。</param>
+        /// <param name="needResolve">鏄惁杞崲鍊�</param>
+        /// <param name="skipName">璺宠繃鐨刵ame</param>
+        /// <returns></returns>
         public static Dictionary<string, string> GetCustomProperties2(ModelDoc2 currentModelDoc,
             bool needResolve,
             HashSet<string> skipName = null)
diff --git a/PdmSwPlugin.Common/Util/LimitedConcurrencyLevelTaskScheduler.cs b/PdmSwPlugin.Common/Util/LimitedConcurrencyLevelTaskScheduler.cs
index 13e41d6..dbbebdc 100644
--- a/PdmSwPlugin.Common/Util/LimitedConcurrencyLevelTaskScheduler.cs
+++ b/PdmSwPlugin.Common/Util/LimitedConcurrencyLevelTaskScheduler.cs
@@ -8,15 +8,15 @@
     /// <summary>
     /// https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.taskscheduler?view=netframework-4.7.2
     /// </summary>
-    public class LimitedConcurrencyLevelTaskScheduler : TaskScheduler
+    public class LimitedConcurrencyLevelTaskSchedulerMsn : TaskScheduler
     {
 
-        public static LimitedConcurrencyLevelTaskScheduler Instance { get; private set; }
+        public static LimitedConcurrencyLevelTaskSchedulerMsn Instance { get; private set; }
         public static TaskFactory Factory { get; private set; }
 
-        static LimitedConcurrencyLevelTaskScheduler()
+        static LimitedConcurrencyLevelTaskSchedulerMsn()
         {
-            Instance = new LimitedConcurrencyLevelTaskScheduler(Environment.ProcessorCount * 10);
+            Instance = new LimitedConcurrencyLevelTaskSchedulerMsn(Environment.ProcessorCount * 10);
             Factory = new TaskFactory(Instance);
         }
 
@@ -34,7 +34,7 @@
         private int _delegatesQueuedOrRunning = 0;
 
         // Creates a new instance with the specified degree of parallelism.
-        public LimitedConcurrencyLevelTaskScheduler(int maxDegreeOfParallelism)
+        public LimitedConcurrencyLevelTaskSchedulerMsn(int maxDegreeOfParallelism)
         {
             if (maxDegreeOfParallelism < 1) throw new ArgumentOutOfRangeException("maxDegreeOfParallelism");
             _maxDegreeOfParallelism = maxDegreeOfParallelism;
diff --git a/PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs b/PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs
index bd955b9..f8bba5f 100644
--- a/PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs
+++ b/PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs
@@ -16,7 +16,7 @@
     {
         public BomTreeReader()
         {
-            factory = LimitedConcurrencyLevelTaskScheduler.Factory;
+            factory = LimitedConcurrencyLevelTaskSchedulerMsn.Factory;
         }
 
         public TaskFactory factory;
@@ -260,6 +260,10 @@
         private static PdmBom ConcatCacheBom(BomInfo info, int level, PdmBom parent, Component2 component)
         {
             if (info == null) return null;
+            //if (component.IsHidden(true))
+            //{
+            //    info.isHidden = true;
+            //}
             PdmBom bom = new PdmBom
             {
                 BomInfo = info,
@@ -267,7 +271,8 @@
                 level = level,
                 quantity = 1,
                 parent = parent,
-                component = component
+                component = component,
+                isHidden = component.IsHidden(true)
             };
             // 灏佽Bom淇℃伅
             bom.Init();
diff --git a/PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs b/PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs
index 620746a..32b593d 100644
--- a/PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs
+++ b/PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs
@@ -260,16 +260,24 @@
 
         private void OpenDrw_Click(object sender, RoutedEventArgs e)
         {
-            Button btn = sender as Button;
-            DrawAudit da = btn.DataContext as DrawAudit;
-            string filePath = GetRealFilePath(da.d2RelativePath);
-            if (!File.Exists(filePath))
+            try
             {
-                this.Error($"鏈嶅姟鍣ㄤ腑鏈壘鍒板伐绋嬪浘鏂囦欢锛岃矾寰�:{filePath}");
-                return;
+                Button btn = sender as Button;
+                DrawAudit da = btn.DataContext as DrawAudit;
+                string filePath = GetRealFilePath(da.d2RelativePath);
+                if (!File.Exists(filePath))
+                {
+                    this.Error($"鏈嶅姟鍣ㄤ腑鏈壘鍒板伐绋嬪浘鏂囦欢锛岃矾寰�:{filePath}");
+                    return;
+                }
+                OpenDocMayError(filePath, (int)swDocumentTypes_e.swDocDRAWING, (int)swOpenDocOptions_e.swOpenDocOptions_ReadOnly,
+                    "");
             }
-            OpenDocMayError(filePath, (int)swDocumentTypes_e.swDocDRAWING, (int)swOpenDocOptions_e.swOpenDocOptions_ReadOnly,
-                "");
+            catch (Exception ex)
+            {
+                this.Error($"鎵撳紑宸ョ▼鍥惧紓甯革紒{ex}");
+                Logger.Error("Open Drw Error!", ex);
+            }
         }
 
         private string GetRealFilePath(string relativePath)
@@ -282,17 +290,25 @@
 
         private void OpenDoc_Click(object sender, RoutedEventArgs e)
         {
-            Button btn = sender as Button;
-            DrawAudit da = btn.DataContext as DrawAudit;
-            string filePath = GetRealFilePath(da.d3RelativePath);
-            if (!File.Exists(filePath))
+            try
             {
-                this.Error($"鏈嶅姟鍣ㄤ腑鏈壘鍒板浘绾告枃浠讹紝璺緞:{filePath}");
-                return;
-            }
+                Button btn = sender as Button;
+                DrawAudit da = btn.DataContext as DrawAudit;
+                string filePath = GetRealFilePath(da.d3RelativePath);
+                if (!File.Exists(filePath))
+                {
+                    this.Error($"鏈嶅姟鍣ㄤ腑鏈壘鍒板浘绾告枃浠讹紝璺緞:{filePath}");
+                    return;
+                }
 
-            OpenDocMayError(filePath, (int)FileExtentionChecker.Check(filePath, out _), (int)swOpenDocOptions_e.swOpenDocOptions_ReadOnly,
-                 "");
+                OpenDocMayError(filePath, (int)FileExtentionChecker.Check(filePath, out _), (int)swOpenDocOptions_e.swOpenDocOptions_ReadOnly,
+                     "");
+            }
+            catch (Exception ex)
+            {
+                this.Error($"鎵撳紑鍥剧焊寮傚父锛亄ex}");
+                Logger.Error("Open 3D Doc Error!", ex);
+            }
         }
 
         public List<DrawAudit> RefreshList()
diff --git a/PdmSwPlugin.Main/Constant/PluginConst.cs b/PdmSwPlugin.Main/Constant/PluginConst.cs
index 6470d7c..522d835 100644
--- a/PdmSwPlugin.Main/Constant/PluginConst.cs
+++ b/PdmSwPlugin.Main/Constant/PluginConst.cs
@@ -3,6 +3,6 @@
     public class PluginConst
     {
         public static readonly string AppId = "DF23E96F-A469-4302-8367-7FA2F798CD09";
-        public static readonly string Version = "0.0.0.42";
+        public static readonly string Version = "0.0.0.44";
     }
 }
diff --git a/PdmSwPlugin.Main/MainControl.xaml.cs b/PdmSwPlugin.Main/MainControl.xaml.cs
index f2ed4ac..8f0049f 100644
--- a/PdmSwPlugin.Main/MainControl.xaml.cs
+++ b/PdmSwPlugin.Main/MainControl.xaml.cs
@@ -18,6 +18,8 @@
 using SuperSocket.SocketBase;
 using SuperSocket.SocketBase.Protocol;
 using PdmSwPlugin.Main.Tcp;
+using SolidWorks.Interop.swconst;
+using System.Windows.Interop;
 
 namespace PdmSwPlugin.Main
 {
@@ -121,6 +123,20 @@
             string updaterPath = "AutoUpdater\\AutoUpdater.exe";
             string exePath = new DirectoryInfo(Assembly.GetExecutingAssembly().Location).Parent.FullName;
             string exeFileName = $"{exePath}\\{updaterPath}";
+            //if (SwApp.SendMsgToUser2("妫�娴嬪埌鎻掍欢鏇存柊锛屾槸鍚︾珛鍒绘洿鏂帮紵锛堣娉ㄦ剰淇濆瓨褰撳墠宸ヤ綔锛�", (int)swMessageBoxIcon_e.swMbInformation, (int)swMessageBoxBtn_e.swMbYesNo)
+            //    == (int)swMessageBoxResult_e.swMbHitYes)
+            //{
+            //    Process updaterProcess = new Process
+            //    {
+            //        StartInfo = new ProcessStartInfo
+            //        {
+            //            FileName = exeFileName,
+            //            Arguments = mainProcessId + ""
+            //        }
+            //    };
+            //    updaterProcess.Start();
+            //}
+
             // 闈炲繀瑕佹洿鏂�
             new Task(() =>
             {
@@ -209,9 +225,29 @@
 
         public void Logout()
         {
-            string binPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), "HengXin", "PdmSwPlugin", "bin");
-            File.Delete(binPath);
-            DeActiveHandler();
+            try
+            {
+                // 鍒犻櫎缂撳瓨bin鏂囦欢
+                string binPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), "HengXin", "PdmSwPlugin", "bin");
+                File.Delete(binPath);
+            }
+            catch (Exception ex)
+            {
+                //SwApp.SendMsgToUser2("鐢ㄦ埛缂撳瓨娓呯悊澶辫触锛�", (int)swMessageBoxIcon_e.swMbWarning, (int)swMessageBoxBtn_e.swMbOk);
+                Logger.Error("Delete User Bin File Failed.", ex);
+            }
+
+            try
+            {
+                // 娓呴櫎UserControl浜嬩欢
+                DeActiveHandler();
+            }
+            catch (Exception ex)
+            {
+                SwApp.SendMsgToUser2("鍙戠敓鏈煡寮傚父锛岃鎯呰瑙佹棩蹇楋紒", (int)swMessageBoxIcon_e.swMbWarning, (int)swMessageBoxBtn_e.swMbOk);
+                Logger.Error("DeActiveHandler Failed.", ex);
+            }
+
             mainTab.tabControl.Items.Clear();
             PdmUser.SetLoginUser(null);
             mainBorder.Child = new LoginControl(LoginSuccess);
@@ -238,7 +274,7 @@
 
         private void self_Unloaded(object sender, RoutedEventArgs e)
         {
-            StopTcpServer();
+            // StopTcpServer();
         }
     }
 }
diff --git a/PdmSwPlugin.Main/MainTab.xaml b/PdmSwPlugin.Main/MainTab.xaml
index df56dfe..8501c1b 100644
--- a/PdmSwPlugin.Main/MainTab.xaml
+++ b/PdmSwPlugin.Main/MainTab.xaml
@@ -19,9 +19,12 @@
             <RowDefinition Height="Auto"/>
         </Grid.RowDefinitions>
         <TabControl Grid.Row="0" x:Name="tabControl"></TabControl>
-        <StatusBar Grid.Row="1" Padding="0" Margin="0" VerticalContentAlignment="Center">
-            <Label x:Name="userLabel" FontWeight="Bold" Padding="0" Margin="0" />
-            <Button Style="{StaticResource LinkButton}" Click="Button_Click">閫�鍑虹櫥褰�</Button>
-        </StatusBar>
+        <DockPanel Grid.Row="1" Margin="0" LastChildFill="False">
+            <Label DockPanel.Dock="Left" x:Name="userLabel" FontWeight="Bold" Padding="0" Margin="0,0,20,0" />
+            <Button DockPanel.Dock="Left" Style="{StaticResource LinkButton}" Click="Button_Click">閫�鍑虹櫥褰�</Button>
+            <Button DockPanel.Dock="Right" Style="{StaticResource LinkButton}" Margin="0,0,20,0"  Click="Refresh_Click">鍒锋柊</Button>
+            <Label DockPanel.Dock="Right" x:Name="configLabel" FontWeight="Bold" Padding="0" Margin="0,0,20,0" />
+            <Label DockPanel.Dock="Right" FontWeight="Bold" Padding="0"  Content="鍘嗗彶鑺傜偣:" />
+        </DockPanel>
     </Grid>
 </UserControl>
diff --git a/PdmSwPlugin.Main/MainTab.xaml.cs b/PdmSwPlugin.Main/MainTab.xaml.cs
index b006421..96c975c 100644
--- a/PdmSwPlugin.Main/MainTab.xaml.cs
+++ b/PdmSwPlugin.Main/MainTab.xaml.cs
@@ -5,6 +5,10 @@
 using System.Windows;
 using System.Windows.Controls;
 using SolidWorks.Interop.swconst;
+using PdmSwPlugin.Common.Setting;
+using System.Threading.Tasks;
+using PdmSwPlugin.Common.Util.Http;
+using System.Collections.Generic;
 
 namespace PdmSwPlugin.Main
 {
@@ -19,6 +23,7 @@
             this.logout = logout;
             InitializeComponent();
             userLabel.Content = $"娆㈣繋鎮紝{PdmUser.LoginUser?.realname}";
+            configLabel.Content = CustomerSetting.Instance["historyFlag"];
         }
 
         private SldWorks swApp;
@@ -37,5 +42,30 @@
                 logout();
             }
         }
+
+        private void Refresh_Click(object sender, RoutedEventArgs e)
+        {
+            configLabel.Content = "鍒锋柊涓�...";
+            Task.Run(() =>
+            {
+                try
+                {
+                    Result<Dictionary<string, string>> res = HttpClientCreator.PostSyncAction<Dictionary<string, string>>("openApi/wpf/refreshConfig", null);
+                    Dictionary<string, string> setting = res.HandleResult();
+                    CustomerSetting.Set(setting);
+                }
+                catch (Exception ex)
+                {
+
+                }
+                finally
+                {
+                    Dispatcher.Invoke(() =>
+                    {
+                        configLabel.Content = CustomerSetting.Instance["historyFlag"];
+                    });
+                }
+            });
+        }
     }
 }
diff --git a/PdmSwPlugin.Main/SwAddIn/MainControl.cs b/PdmSwPlugin.Main/SwAddIn/MainControl.cs
index 36758e6..6b1208c 100644
--- a/PdmSwPlugin.Main/SwAddIn/MainControl.cs
+++ b/PdmSwPlugin.Main/SwAddIn/MainControl.cs
@@ -17,6 +17,9 @@
 using PdmSwPlugin.MaterialSelect;
 using PdmSwPlugin.PriceCheck;
 using PdmSwPlugin.Common.Setting;
+using Microsoft.Win32;
+using System.IO;
+using System.Diagnostics;
 
 namespace PdmSwPlugin.Main
 {
@@ -28,7 +31,7 @@
     {
         public SldWorks SwApp { get; private set; }
 
-        private ILog Logger = LogManager.GetLogger("Main");
+        private ILog Logger;
         private PluginSetting GlobalConfig;
 
         private string[] plugins = {
@@ -55,11 +58,88 @@
 
         public MainControl(SldWorks swAddin)
         {
+            var log = LogManager.GetLogger("Main");
+            Logger = log;
             SwApp = swAddin;
             GlobalConfig = PluginSetting.Instance;
             InitializeComponent();
             self.DataContext = this;
             InitTcpServer();
+            try
+            {
+                CheckAutoRunRegKey();
+                StartListenerProcess();
+            }
+            catch (Exception e)
+            {
+                log.Error("Start Listener Error!", e);
+            }
+        }
+
+        /// <summary>
+        /// 璁剧疆鐩戝惉鍣ㄨ嚜鍚姩
+        /// </summary>
+        private void CheckAutoRunRegKey()
+        {
+            RegistryKey root = null;
+            RegistryKey key = null;
+            try
+            {
+                root = Registry.CurrentUser;
+                key = root.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
+                string name = "SolidWorksListener";
+                if (key == null)
+                {
+                    key = root.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
+                }
+                // 娌℃湁璺緞鎴栬�呰矾寰勬寚鍚慹xe涓嶅锛屽氨鏇存柊鑷惎鍔ㄨ矾寰�
+                string listenerPath = key.GetValue(name)?.ToString();
+                string rootDir = new DirectoryInfo(Assembly.GetExecutingAssembly().Location).Parent.FullName;
+                string newPath = Path.Combine(rootDir, "Listener", "SolidWorksListener.exe");
+                if (string.IsNullOrEmpty(listenerPath) || new Uri(listenerPath) != new Uri(newPath))
+                {
+                    key.SetValue(name, newPath, RegistryValueKind.String);
+                }
+
+            }
+            catch (Exception e)
+            {
+                Logger.Error("CheckAutoRunRegKey Failed!", e);
+            }
+            finally
+            {
+                try
+                {
+                    if (key != null) key.Close();
+                    if (root != null) root.Close();
+                }
+                catch (Exception ex)
+                {
+                    Logger.Error("Reg Key Close Failed!", ex);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鍚姩Listener鐩稿叧杩涚▼
+        /// </summary>
+        public void StartListenerProcess()
+        {
+            string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+            string path1 = Path.Combine(dir, "Listener", "SolidWorksListener.exe");
+            if (File.Exists(path1))
+            {
+                ProcessStartInfo info = new ProcessStartInfo
+                {
+                    FileName = path1,
+                    WorkingDirectory = Path.GetDirectoryName(path1)
+                };
+
+                new Process
+                {
+                    StartInfo = info
+                }.Start();
+            }
         }
 
         // 鏈湴璋冭瘯鐢紝杩炴帴SolidWorks
diff --git a/PdmSwPlugin.PDM/PdmControl.xaml.cs b/PdmSwPlugin.PDM/PdmControl.xaml.cs
index 6f5a86b..6e6148a 100644
--- a/PdmSwPlugin.PDM/PdmControl.xaml.cs
+++ b/PdmSwPlugin.PDM/PdmControl.xaml.cs
@@ -39,6 +39,7 @@
 using System.Windows.Input;
 using NPOI.POIFS.Properties;
 using NPOI.POIFS.Crypt;
+using System.Threading.Tasks.Schedulers;
 
 namespace PdmSwPlugin.PDM
 {
@@ -144,11 +145,11 @@
                     this.Warning("璇锋墦寮�涓�寮犲浘绾�");
                     return new ObservableCollection<PdmBom>();
                 }
-                if (7 == doc.GetBlockingState())
-                {
-                    this.Warning("璇风瓑寰呮枃妗e姞杞藉畬姣�");
-                    return new ObservableCollection<PdmBom>();
-                }
+                //if (7 == doc.GetBlockingState())
+                //{
+                //    this.Warning("璇风瓑寰呮枃妗e姞杞藉畬姣�");
+                //    return new ObservableCollection<PdmBom>();
+                //}
 
                 DateTime beforeDT = DateTime.Now;
 
@@ -896,7 +897,7 @@
 
         public Dictionary<string, DrawInfo> GetAllProperties(List<string> ErrMsgs)
         {
-            Dictionary<string, DrawInfo> result = new Dictionary<string, DrawInfo>();
+            ConcurrentDictionary<string, DrawInfo> result = new ConcurrentDictionary<string, DrawInfo>();
             PdmBom topBom = model.BomTree[0];
             CountdownEvent counter = new CountdownEvent(1);
             _ = ThreadPool.QueueUserWorkItem(
@@ -906,7 +907,65 @@
                 );
             counter.Wait();
             counter.Dispose();
-            return result;
+            return new Dictionary<string, DrawInfo>(result);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍏ㄩ儴灞炴��
+        /// </summary>
+        /// <param name="param"></param>
+        public void GetAll(object param)
+        {
+            object[] datas = param as object[];
+            PdmBom bom = (PdmBom)datas[0];
+            ModelDoc2 sldDoc = bom.doc;
+            Component2 component = bom.component;
+            ConcurrentDictionary<string, DrawInfo> result = (ConcurrentDictionary<string, DrawInfo>)datas[1];
+            CountdownEvent counter = (CountdownEvent)datas[2];
+            List<string> ErrMsgs = (List<string>)datas[3];
+            int level = (int)datas[4];
+            try
+            {
+                counter.TryAddCount();
+                string filepath = bom.partNo;
+
+
+                if (result.ContainsKey(filepath))
+                {
+                    return;
+                }
+
+                if (!bom.skipCheck)
+                {
+                    result[filepath] = GetSingleDrawInfo(bom);
+                }
+
+                ObservableCollection<PdmBom> children = bom.modules;
+                if (children != null)
+                {
+                    foreach (PdmBom child in children)
+                    {
+                        _ = ThreadPool.QueueUserWorkItem(
+                              new WaitCallback(GetAll),
+                              new object[] { child, result, counter, ErrMsgs, 1 });
+                    }
+                }
+                MaskAdorner.ShowMessage(content, filepath);
+            }
+            catch (Exception e)
+            {
+                bom.drawInfo.checkRuleResult = 2;
+                bom.drawInfo.errMessages = new List<string> { e.Message };
+                Logger.Error($"V{PdmUser.LoginUser.pluginVersion},[{bom.filePath}] Read MASS Properies Failed.", e);
+            }
+            finally
+            {
+                counter.Signal();
+                if (level == 0)
+                {
+                    counter.Signal();
+                }
+            }
         }
 
         /// <summary>
@@ -926,6 +985,7 @@
             Dictionary<string, string> allProperties = new Dictionary<string, string>();
             allProperties["鐗╂枡鍨嬪彿"] = bom.partModel;
             DrawInfo drawInfo = bom._drawInfo;
+            drawInfo.isHidden = bom.isHidden;
             drawInfo.allProperties = allProperties;
             allProperties["鍘嬬缉"] = bom.suppressed.ToString();
             allProperties["杞婚噺鍖�"] = bom.lightWeight.ToString();
@@ -947,7 +1007,7 @@
             // 宸ョ▼鍥句竴鑷存�ф鏌�
             allProperties["宸ョ▼鍥炬槸鍚﹀瓨鍦�"] = drawExists.ToString();
             allProperties["md5"] = bom.localD3Md5;
-            if (bom.lost || sldDoc == null)
+            if (bom.lost || bom.BomInfo.isHidden || sldDoc == null)
             {
                 allProperties["鍥剧焊鏄惁瀛樺湪"] = "false";
                 return drawInfo;
@@ -1005,17 +1065,28 @@
             return drawInfo;
         }
 
-        /// <summary>
-        /// 鑾峰彇鍏ㄩ儴灞炴��
-        /// </summary>
-        /// <param name="param"></param>
-        public void GetAll(object param)
+        public Dictionary<string, DrawInfo> GetAllPropertiesByTask(List<string> ErrMsgs)
+        {
+            ConcurrentDictionary<string, DrawInfo> result = new ConcurrentDictionary<string, DrawInfo>();
+            PdmBom topBom = model.BomTree[0];
+            CountdownEvent counter = new CountdownEvent(1);
+            Task.Run(() =>
+            {
+                GetAllByTask(new object[] {
+                topBom, result, counter, ErrMsgs, 0 });
+            });
+            counter.Wait();
+            counter.Dispose();
+            return new Dictionary<string, DrawInfo>(result);
+        }
+
+        public void GetAllByTask(object param)
         {
             object[] datas = param as object[];
             PdmBom bom = (PdmBom)datas[0];
             ModelDoc2 sldDoc = bom.doc;
             Component2 component = bom.component;
-            Dictionary<string, DrawInfo> result = (Dictionary<string, DrawInfo>)datas[1];
+            ConcurrentDictionary<string, DrawInfo> result = (ConcurrentDictionary<string, DrawInfo>)datas[1];
             CountdownEvent counter = (CountdownEvent)datas[2];
             List<string> ErrMsgs = (List<string>)datas[3];
             int level = (int)datas[4];
@@ -1023,24 +1094,34 @@
             {
                 counter.TryAddCount();
                 string filepath = bom.partNo;
-                if (result.ContainsKey(filepath))
+                lock (result)
                 {
-                    return;
+                    if (result.ContainsKey(filepath))
+                    {
+                        if (bom.isHidden)
+                        {
+                            result[filepath].isHidden = true;
+                        }
+                        return;
+                    }
+                    if (!bom.skipCheck)
+                    {
+                        result[filepath] = GetSingleDrawInfo(bom);
+                    }
                 }
 
-                if (!bom.skipCheck)
-                {
-                    result[filepath] = GetSingleDrawInfo(bom);
-                }
+
+
 
                 ObservableCollection<PdmBom> children = bom.modules;
                 if (children != null)
                 {
                     foreach (PdmBom child in children)
                     {
-                        _ = ThreadPool.QueueUserWorkItem(
-                              new WaitCallback(GetAll),
-                              new object[] { child, result, counter, ErrMsgs, 1 });
+                        Task.Run(() =>
+                        {
+                            GetAllByTask(new object[] { child, result, counter, ErrMsgs, 1 });
+                        });
                     }
                 }
                 MaskAdorner.ShowMessage(content, filepath);
@@ -1054,7 +1135,10 @@
             finally
             {
                 counter.Signal();
-                if (level == 0) counter.Signal();
+                if (level == 0)
+                {
+                    counter.Signal();
+                }
             }
         }
 
@@ -1096,78 +1180,127 @@
             return allSuccess;
         }
 
-        public void sb(dynamic[] datas) {
-            /*Dictionary<string, DrawInfo> properties = datas[0];
-            string key = datas[1];
-            KeyValuePair<string, DrawInfo> property = datas[2];
-            List<string> temp = datas[3];
-            CountdownEvent counter = datas[4];
-            try
-            {
-               
-                int iii, ref bool allSuccess
-
-                Logger.Info($"{key} checking rule...");
-                iii++;
-                Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
-                DrawInfo checkResult = result.HandleResult();
-                properties[key].checkRuleResult = checkResult.checkRuleResult;
-                properties[key].errMessages = checkResult.errMessages;
-                var msgs = checkResult.errMessages;
-                if (!properties[key].HistoryData && !checkResult.checkRuleOk)
-                {
-                    allSuccess = false;
-                }
-
-                if (!properties[key].HistoryData && msgs != null && msgs.Count > 0)
-                {
-                    lock (temp)
-                    {
-                        foreach (string msg in msgs)
-                        {
-                            temp.Add($"鐗╂枡銆恵key}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒{msg}");
-                        }
-                    }
-                }
-                MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
-            }
-            catch (Exception ex)
-            {
-                properties[key].checkRuleResult = 2;
-                properties[key].errMessages = new List<string> { "鍙戣捣妫�鏌ュけ璐ワ紝璇烽噸璇�" };
-                lock (temp)
-                {
-                    temp.Add($"鐗╂枡銆恵key}銆戝彂璧锋鏌ュけ璐ワ紝璇烽噸璇�");
-                }
-                allSuccess = false;
-                MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
-            }
-            finally
-            {
-                counter.Signal();
-            }*/
-        }
-
         public bool DoCheckRuleAsync(out List<string> messages)
         {
             var temp = new List<string>();
             bool allSuccess = true;
-            Dictionary<string, DrawInfo> properties = GetAllProperties(temp);
+            Dictionary<string, DrawInfo> properties = GetAllPropertiesByTask(temp);
             MaskAdorner.ShowMessage(content, "姝e湪璇锋眰鏁版嵁...");
-            var factory = LimitedConcurrencyLevelTaskScheduler.Factory;
+           // var factory = LimitedConcurrencyLevelTaskScheduler.Factory;
             CountdownEvent counter = new CountdownEvent(properties.Count);
-            int iii = 1;
+            int iii = 0;
             foreach (KeyValuePair<string, DrawInfo> property in properties)
             {
-                string key = property.Key;
-                _ = ThreadPool.QueueUserWorkItem(
-                (WaitCallback)delegate
+                /// 杩欎釜鏂规硶鏈�蹇紝浣嗕笉濂界鎺э紝鍥犱负涓嶇煡閬撳睘鎬у瓧鍏告湁澶氬ぇ
+                Task.Run(() =>
                 {
-
+                    string key = property.Key;
+                    iii++;
                     try
                     {
                         Logger.Error($"{key} checking rule...");
-                        iii++;
+                        Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
+                        DrawInfo checkResult = result.HandleResult();
+                        properties[key].checkRuleResult = checkResult.checkRuleResult;
+                        properties[key].errMessages = checkResult.errMessages;
+                        var msgs = checkResult.errMessages;
+                        if (!properties[key].HistoryData && (!checkResult.checkRuleOk||property.Value.isHidden))
+                        {
+                            allSuccess = false;
+                        }
+
+                        if (!properties[key].HistoryData)
+                        {
+                            lock (temp)
+                            {
+                                if (property.Value.isHidden)
+                                {
+                                    temp.Add($"鐗╂枡銆恵key}銆戣璁剧疆涓洪殣钘�!");
+                                }
+                                if (msgs != null && msgs.Count > 0)
+                                {
+                                    foreach (string msg in msgs)
+                                    {
+                                        temp.Add($"鐗╂枡銆恵key}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒{msg}");
+                                    }
+                                }
+                            }
+                        }
+                        MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+                    }
+                    catch (Exception ex)
+                    {
+                        properties[key].checkRuleResult = 2;
+                        properties[key].errMessages = new List<string> { "鍙戣捣妫�鏌ュけ璐ワ紝璇烽噸璇�" };
+                        lock (temp)
+                        {
+                            temp.Add($"鐗╂枡銆恵key}銆戝彂璧锋鏌ュけ璐ワ紝璇烽噸璇�");
+                        }
+                        allSuccess = false;
+                        MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+                    }
+                    finally
+                    {
+                        counter.Signal();
+                    }
+                });
+
+                //LimitedConcurrencyLevelTaskScheduler scheduler = new LimitedConcurrencyLevelTaskScheduler(int.MaxValue);
+                //Task.Factory.StartNew(() => {
+                //    string key = property.Key;
+                //    iii++;
+                //    try
+                //    {
+                //        Logger.Error($"{key} checking rule...");
+                //        Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
+                //        DrawInfo checkResult = result.HandleResult();
+                //        properties[key].checkRuleResult = checkResult.checkRuleResult;
+                //        properties[key].errMessages = checkResult.errMessages;
+                //        var msgs = checkResult.errMessages;
+                //        if (!properties[key].HistoryData && !checkResult.checkRuleOk)
+                //        {
+                //            allSuccess = false;
+                //        }
+
+                //        if (!properties[key].HistoryData && msgs != null && msgs.Count > 0)
+                //        {
+                //            lock (temp)
+                //            {
+                //                foreach (string msg in msgs)
+                //                {
+                //                    temp.Add($"鐗╂枡銆恵key}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒{msg}");
+                //                }
+                //            }
+                //        }
+                //        MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+                //    }
+                //    catch (Exception ex)
+                //    {
+                //        properties[key].checkRuleResult = 2;
+                //        properties[key].errMessages = new List<string> { "鍙戣捣妫�鏌ュけ璐ワ紝璇烽噸璇�" };
+                //        lock (temp)
+                //        {
+                //            temp.Add($"鐗╂枡銆恵key}銆戝彂璧锋鏌ュけ璐ワ紝璇烽噸璇�");
+                //        }
+                //        allSuccess = false;
+                //        MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+                //    }
+                //    finally
+                //    {
+                //        counter.Signal();
+                //    }
+                //}, CancellationToken.None, TaskCreationOptions.None, scheduler);
+
+
+                /// 涓嬮潰涓や釜閮藉湪绠℃帶Task鏁伴噺锛屼絾杩樻槸寰堟參
+                /*string key = property.Key;
+                _ = ThreadPool.QueueUserWorkItem(
+                (WaitCallback)delegate
+                {
+                    iii++;
+                    try
+                    {
+                        Logger.Error($"{key} checking rule...");
                         Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
                         DrawInfo checkResult = result.HandleResult();
                         properties[key].checkRuleResult = checkResult.checkRuleResult;
@@ -1205,12 +1338,53 @@
                     {
                         counter.Signal();
                     }
-                });
+                });*/
 
-                /* factory.StartNew(() =>
-                 {
+                //factory.StartNew(() =>
+                //{
+                //    string key = property.Key;
+                //    iii++;
+                //    try
+                //    {
+                //        Logger.Error($"{key} checking rule...");
+                //        Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
+                //        DrawInfo checkResult = result.HandleResult();
+                //        properties[key].checkRuleResult = checkResult.checkRuleResult;
+                //        properties[key].errMessages = checkResult.errMessages;
+                //        var msgs = checkResult.errMessages;
+                //        if (!properties[key].HistoryData && !checkResult.checkRuleOk)
+                //        {
+                //            allSuccess = false;
+                //        }
 
-                 });*/
+                //        if (!properties[key].HistoryData && msgs != null && msgs.Count > 0)
+                //        {
+                //            lock (temp)
+                //            {
+                //                foreach (string msg in msgs)
+                //                {
+                //                    temp.Add($"鐗╂枡銆恵key}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒{msg}");
+                //                }
+                //            }
+                //        }
+                //        MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+                //    }
+                //    catch (Exception ex)
+                //    {
+                //        properties[key].checkRuleResult = 2;
+                //        properties[key].errMessages = new List<string> { "鍙戣捣妫�鏌ュけ璐ワ紝璇烽噸璇�" };
+                //        lock (temp)
+                //        {
+                //            temp.Add($"鐗╂枡銆恵key}銆戝彂璧锋鏌ュけ璐ワ紝璇烽噸璇�");
+                //        }
+                //        allSuccess = false;
+                //        MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+                //    }
+                //    finally
+                //    {
+                //        counter.Signal();
+                //    }
+                //});
             }
             counter.Wait();
             counter.Dispose();
@@ -1245,7 +1419,7 @@
                 try
                 {
                     RefreshBomList(SwApp.IActiveDoc2);
-                    if (!DoCheckRule(out List<string> msgs))
+                    if (!DoCheckRuleAsync(out List<string> msgs))
                     {
                         Dispatcher.Invoke(() =>
                         {
@@ -1615,13 +1789,19 @@
                     return;
                 }
 
-                if (bom.checkRuleOk)
+                if (bom.checkRuleOk && !bom.isHidden)
                 {
                     this.Show("瑙勫垯妫�鏌ラ�氳繃");
                 }
                 else
                 {
-                    MultiExWindow exWin = new MultiExWindow(this, "妫�鏌ョ粨鏋�", bom.drawInfo.errMessages);
+                    List<string> errs = new List<string>();
+                    if (bom.isHidden)
+                    {
+                        errs.Add("鏂囨。琚缃负闅愯棌");
+                    }
+                    errs.AddRange(bom.drawInfo.errMessages);
+                    MultiExWindow exWin = new MultiExWindow(this, "妫�鏌ョ粨鏋�", errs);
                     exWin.ShowDialog();
                 }
             }
@@ -1817,7 +1997,7 @@
                         {
                             throw new CantCheckInException(new List<string> { "璇锋墦寮�涓�寮犲浘绾�" });
                         }
-                        DoCheckRule(out _);
+                        DoCheckRuleAsync(out _);
                         // 绛涢�夋墍鏈夊湪鐗╂枡鏄庣粏琛ㄤ腑锛屼笉璺宠繃妫�鏌ュ苟涓旀鏌ユ湭閫氳繃鐨勶紝绫诲瀷鏄姞宸ヤ欢鐨勬湭閫氳繃瀹℃牳鐨勶紝鍔犲伐浠跺鏍搁�氳繃鐨勪絾鍥剧焊鍙樻洿鐨�
                         List<string> errs = model.bomTreeReader.CacheList.Select(b => b.NeedStopCheckIn())
                         .Where(s => s != null).ToList();
diff --git a/PdmSwPlugin.PDM/PdmSwPlugin.PDM.csproj b/PdmSwPlugin.PDM/PdmSwPlugin.PDM.csproj
index 2ab1039..470d944 100644
--- a/PdmSwPlugin.PDM/PdmSwPlugin.PDM.csproj
+++ b/PdmSwPlugin.PDM/PdmSwPlugin.PDM.csproj
@@ -98,6 +98,9 @@
     <Reference Include="NPOI.OpenXmlFormats, Version=2.6.0.0, Culture=neutral, PublicKeyToken=0df73ec7942b34e1, processorArchitecture=MSIL">
       <HintPath>..\PdmSw\packages\NPOI.2.6.0\lib\net472\NPOI.OpenXmlFormats.dll</HintPath>
     </Reference>
+    <Reference Include="ParallelExtensionsExtras, Version=1.2.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\MSFT.ParallelExtensionsExtras.1.2.0\lib\ParallelExtensionsExtras.dll</HintPath>
+    </Reference>
     <Reference Include="SixLabors.Fonts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d998eea7b14cab13, processorArchitecture=MSIL">
       <HintPath>..\PdmSw\packages\SixLabors.Fonts.1.0.0-beta19\lib\netstandard2.0\SixLabors.Fonts.dll</HintPath>
     </Reference>
diff --git a/PdmSwPlugin.PDM/packages.config b/PdmSwPlugin.PDM/packages.config
index 2a4494e..0569c47 100644
--- a/PdmSwPlugin.PDM/packages.config
+++ b/PdmSwPlugin.PDM/packages.config
@@ -4,6 +4,7 @@
   <package id="MathNet.Numerics.Signed" version="4.15.0" targetFramework="net472" />
   <package id="Microsoft.Bcl.AsyncInterfaces" version="7.0.0" targetFramework="net472" />
   <package id="Microsoft.IO.RecyclableMemoryStream" version="2.2.0" targetFramework="net472" />
+  <package id="MSFT.ParallelExtensionsExtras" version="1.2.0" targetFramework="net472" />
   <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net472" />
   <package id="NPOI" version="2.6.0" targetFramework="net472" />
   <package id="Portable.BouncyCastle" version="1.9.0" targetFramework="net472" />
diff --git a/PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs b/PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs
index 4076f04..c9ae722 100644
--- a/PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs
+++ b/PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs
@@ -53,8 +53,8 @@
         public const string size = "澶栧舰灏哄";
 
         public static readonly ObservableCollection<string> MaterialTypes = new ObservableCollection<string> { "鏅�氫欢",
-        "鏄撴崯浠�","澶囦欢"
-        };
+       "鏈虹僵","鏈烘灦","澶ф澘"
+        };// "鏄撴崯浠�","澶囦欢",
 
         public static readonly ObservableCollection<string> DocTypes = new ObservableCollection<string> { "妯$粍", "鍔犲伐浠�" };
         public static readonly HashSet<string> SpecialJgjType = new HashSet<string> { "鍨嬫潗浠�", "閲戝睘鏉跨剨鎺ヤ欢" };
diff --git a/PdmSwPlugin.PropertySetting/Panel/Model/JgjBasePanelModel.cs b/PdmSwPlugin.PropertySetting/Panel/Model/JgjBasePanelModel.cs
index 889a30d..6b01453 100644
--- a/PdmSwPlugin.PropertySetting/Panel/Model/JgjBasePanelModel.cs
+++ b/PdmSwPlugin.PropertySetting/Panel/Model/JgjBasePanelModel.cs
@@ -45,8 +45,8 @@
         }
 
         private ObservableCollection<string> _materialTypeItems = new ObservableCollection<string> { "鏅�氫欢",
-        "鏄撴崯浠�","澶囦欢"
-        };
+       "鏈虹僵","鏈烘灦","澶ф澘"
+        };// "鏄撴崯浠�","澶囦欢",
         public ObservableCollection<string> materialTypeItems
         {
             get => _materialTypeItems;
diff --git a/PdmSwPlugin.PropertySetting/PdmSwPlugin.PropertySetting.csproj b/PdmSwPlugin.PropertySetting/PdmSwPlugin.PropertySetting.csproj
index 062077d..09ef8f2 100644
--- a/PdmSwPlugin.PropertySetting/PdmSwPlugin.PropertySetting.csproj
+++ b/PdmSwPlugin.PropertySetting/PdmSwPlugin.PropertySetting.csproj
@@ -105,6 +105,9 @@
     </Reference>
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="SettingControl.xaml.cs">
+      <DependentUpon>SettingControl.xaml</DependentUpon>
+    </Compile>
     <Compile Include="CommonSettingControl.xaml.cs">
       <DependentUpon>CommonSettingControl.xaml</DependentUpon>
     </Compile>
@@ -133,6 +136,13 @@
     <Compile Include="PropertySettingControl.xaml.cs">
       <DependentUpon>PropertySettingControl.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Tab\JgjPartTab.xaml.cs">
+      <DependentUpon>JgjPartTab.xaml</DependentUpon>
+    </Compile>
+    <Page Include="SettingControl.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="CommonSettingControl.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
@@ -161,6 +171,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Tab\JgjPartTab.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Properties\AssemblyInfo.cs">
diff --git a/PdmSwPlugin.PropertySetting/SettingControl.xaml b/PdmSwPlugin.PropertySetting/SettingControl.xaml
new file mode 100644
index 0000000..3a4674b
--- /dev/null
+++ b/PdmSwPlugin.PropertySetting/SettingControl.xaml
@@ -0,0 +1,39 @@
+锘�<UserControl x:Class="PdmSwPlugin.PropertySetting.SettingControl"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800">
+    <UserControl.Resources>
+        <ResourceDictionary>
+            <ResourceDictionary.MergedDictionaries>
+                <ResourceDictionary Source="/PdmSwPlugin.Common;component/Style/ToolBar.xaml"/>
+            </ResourceDictionary.MergedDictionaries>
+        </ResourceDictionary>
+    </UserControl.Resources>
+
+    <StackPanel>
+        <ToolBarTray Background="#FFF" ToolBarTray.IsLocked="True" >
+            <ToolBar Style="{StaticResource CommonToolBar}" ToolBar.OverflowMode="Never" Band="1" BandIndex="1" Height="30" Background="#FFF">
+                <Button ToolTip="鍒锋柊" Content="&#xe631;鍒锋柊" Click="Refresh_Click" FontSize="16"/>
+
+                <Button ToolTip="淇濆瓨" Content="&#xe60d;淇濆瓨" FontFamily="{StaticResource iconfont}" FontSize="16"
+                        Click="SaveButton_Click"/>
+                <!--<Button ToolTip="鍙﹀瓨" Content="&#xe60b;" FontFamily="{StaticResource iconfont}" FontSize="16"
+                        Click="SaveAsButton_Click"/>-->
+                <!--<Button ToolTip="鍙﹀瓨">
+                    <Image Source="Image/save.png"/>
+                </Button>-->
+                <Button ToolTip="鍔犺浇鍙�夐」" Content="&#xe752;鍔犺浇鍙�夐」" Click="LoadComboBox_Click" FontSize="16"/>
+            </ToolBar>
+        </ToolBarTray>
+        <Label Content="{Binding ReadDocPath}"/>
+        <AdornerDecorator x:Name="content">
+            <StackPanel x:Name="contentPanel">
+                
+            </StackPanel>
+        </AdornerDecorator>
+    </StackPanel>
+</UserControl>
+
diff --git a/PdmSwPlugin.PropertySetting/SettingControl.xaml.cs b/PdmSwPlugin.PropertySetting/SettingControl.xaml.cs
new file mode 100644
index 0000000..06fb90a
--- /dev/null
+++ b/PdmSwPlugin.PropertySetting/SettingControl.xaml.cs
@@ -0,0 +1,715 @@
+锘縰sing log4net;
+using PdmSwPlugin.Commmon.Util.UI;
+using PdmSwPlugin.Common.Util;
+using PdmSwPlugin.Common.Util.Http;
+using PdmSwPlugin.PropertySetting.Interface;
+using SolidWorks.Interop.sldworks;
+using SolidWorks.Interop.swconst;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Net.Http;
+using System.Runtime.CompilerServices;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using PdmSwPlugin.Common.Interface;
+using PdmSwPlugin.Common;
+using PdmSwPlugin.PropertySetting.Entity;
+using PdmSwPlugin.PropertySetting.Panel;
+using System.Windows.Threading;
+using PdmSwPlugin.Common.Setting;
+using System.IO;
+using System.Runtime.InteropServices;
+
+namespace PdmSwPlugin.PropertySetting
+{
+
+    /// <summary>
+    /// CommonSettingControl.xaml 鐨勪氦浜掗�昏緫
+    /// </summary>
+    [PdmSwPlugin(Title = "灞炴�ц缃�")]
+    public partial class SettingControl : UserControl, ISwAppSetter, INotifyPropertyChanged
+        , IActiveDocChangeHandler, ITabControlSelectionChangeHandler
+    {
+        private static ILog Logger = LogManager.GetLogger("PropertySetting");
+
+        #region 涓嶈兘鍏敤鐨勪笢瑗匡紝鐪熸湁浣犵殑鍟奀#
+        public event PropertyChangedEventHandler PropertyChanged;
+        public void RaisePropertyChanged(string name)
+        {
+            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
+        }
+        public void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
+        {
+            old = @new;
+            if (propertyName != null)
+            {
+                RaisePropertyChanged(propertyName);
+            }
+        }
+        #endregion
+
+        public readonly Dictionary<string, UserControl> controlCache = new Dictionary<string, UserControl>();
+
+        #region 灞炴��
+        public SldWorks SwApp { get; private set; }
+        /// <summary>
+        /// 婵�娲荤殑鏂囨。
+        /// </summary>
+        public ModelDoc2 activeDoc { set; get; }
+        /// <summary>
+        /// 涓婃璇诲彇鐨勬枃妗�
+        /// </summary>
+        public ModelDoc2 LastReadDoc { get; set; }
+        /// <summary>
+        /// 褰撳墠璇诲彇鐨勬枃妗�
+        /// </summary>
+        public ModelDoc2 ReadDoc { get; set; }
+        /// <summary>
+        /// 褰撳墠璇诲彇鐨勭粍浠�
+        /// </summary>
+        public Component2 ReadComponent { get; set; }
+
+        private HttpClient Client { get; set; }
+
+        Dictionary<string, JgjType> settings;
+        #endregion
+
+        #region UI缁戝畾
+        private string _readDocPath;
+        public string ReadDocPath
+        {
+            get => _readDocPath;
+            set => RaiseAndSetIfChanged(ref _readDocPath, value);
+        }
+        #endregion
+        private HttpClientCreator clientCreator { get; set; }
+
+        private UserControl ActiveOpter { get; set; }
+
+        public SettingControl()
+        {
+            clientCreator = new HttpClientCreator(new HttpConfig(PluginSetting.Instance.BaseAddress));
+            InitializeComponent();
+            DataContext = this;
+        }
+
+        public SettingControl(SldWorks SwApp) : this()
+        {
+            this.SwApp = SwApp;
+        }
+
+        public void InitPropertyData()
+        {
+            if (Client == null)
+            {
+                Client = clientCreator.GetClient();
+            }
+            DefaultPanel defaultPanel = new DefaultPanel();
+            controlCache.Add("default", defaultPanel);
+
+            JgjPartPanel jgjPart = new JgjPartPanel();
+            controlCache.Add("jgjPart", jgjPart);
+
+            JgjModulePanel jgjModule = new JgjModulePanel();
+            controlCache.Add("jgjModule", jgjModule);
+
+            var stPart = new StandardPartPanel();
+            controlCache.Add("standardPart", stPart);
+
+            var stModule = new StandardModulePanel();
+            controlCache.Add("standardModule", stModule);
+            LoadComboxItemSource();
+            Refresh_Click(null, null);
+        }
+
+        private void Jgj_SinglePropertyChanged(object sender, string name, object value)
+        {
+            // CustomPropertyUtil.SetCustomProperties(ReadDoc, name, (string)value);
+        }
+
+        /// <summary>
+        /// 浠庢湇鍔″櫒鍔犺浇鍚勭閫夐」
+        /// </summary>
+        private void LoadComboxItemSource()
+        {
+            try
+            {
+                Result<Dictionary<string, JgjType>> res = Client.GetSyncAction<Dictionary<string, JgjType>>("design/rule/openApi/test");
+                Dictionary<string, JgjType> datas = res.HandleResult();
+                settings = datas;
+                foreach (var key in controlCache.Keys)
+                {
+                    (controlCache[key] as IPropertyOpt).SetSettings(settings);
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Error("Request Jgj properties failed.", ex);
+                this.Error($"璇锋眰鍔犲伐浠跺睘鎬уけ璐ワ紒{ex.Message}");
+            }
+        }
+
+        private void UpdateActiveDoc()
+        {
+            if (activeDoc != null)
+            {
+                DetachDocNotify(activeDoc);
+            }
+
+            activeDoc = SwApp.ActiveDoc;
+            if (activeDoc != null)
+            {
+                AttachDocNotify(activeDoc);
+                int docType = activeDoc.GetType();
+                if (docType == (int)swDocumentTypes_e.swDocASSEMBLY)
+                {
+                    activeDoc.ClearSelection2(true);
+                }
+            }
+            UpdateUI(activeDoc);
+        }
+
+        /// <summary>
+        /// 闄勫姞涓�浜涙彃浠惰寖鍥村唴鐨勪簨浠�
+        /// </summary>
+        /// <param name="doc"></param>
+        private void AttachDocNotify(ModelDoc2 doc)
+        {
+            int docType = doc.GetType();
+            if (docType == (int)swDocumentTypes_e.swDocASSEMBLY)
+            {
+                AssemblyDoc ass = doc as AssemblyDoc;
+                ass.UserSelectionPostNotify += Ass_UserSelectionPostNotify;
+                ass.DestroyNotify2 += ActiveDocDestroyNotify2;
+            }
+            else if (docType == (int)swDocumentTypes_e.swDocPART)
+            {
+                PartDoc part = doc as PartDoc;
+                part.DestroyNotify2 += ActiveDocDestroyNotify2;
+            }
+            else if (docType == (int)swDocumentTypes_e.swDocDRAWING)
+            {
+                DrawingDoc draw = doc as DrawingDoc;
+                draw.DestroyNotify2 += ActiveDocDestroyNotify2;
+            }
+        }
+
+        /// <summary>
+        /// 绉婚櫎鎻掍欢鑼冨洿鍐呯殑涓�浜涗簨浠�
+        /// </summary>
+        /// <param name="doc"></param>
+        private void DetachDocNotify(ModelDoc2 doc)
+        {
+            try
+            {
+                int docType = doc.GetType();
+                if (docType == (int)swDocumentTypes_e.swDocASSEMBLY)
+                {
+                    AssemblyDoc ass = doc as AssemblyDoc;
+                    ass.UserSelectionPostNotify -= Ass_UserSelectionPostNotify;
+                    ass.DestroyNotify2 -= ActiveDocDestroyNotify2;
+                }
+                else if (docType == (int)swDocumentTypes_e.swDocPART)
+                {
+                    PartDoc part = doc as PartDoc;
+                    part.DestroyNotify2 -= ActiveDocDestroyNotify2;
+                }
+                else if (docType == (int)swDocumentTypes_e.swDocDRAWING)
+                {
+                    DrawingDoc draw = doc as DrawingDoc;
+                    draw.DestroyNotify2 -= ActiveDocDestroyNotify2;
+                }
+            }
+            catch (COMException e)
+            {
+                // 濡傛灉sw鎶婁笉鏄閰嶄綋/闆朵欢浣�/宸ョ▼鍥剧殑鏂囨。鍏充簡锛屾湁鏃朵細鎶ヨ繖涓棶棰橈紝鐣欎釜鏃ュ織涓嶆姤閿欎簡
+                Logger.Warn("COMObject detach event failed.", e);
+                activeDoc = null;
+            }
+        }
+
+        private int ActiveDocDestroyNotify2(int DestroyType)
+        {
+            if (activeDoc == null)
+            {
+                return 0;
+            }
+            DetachDocNotify(activeDoc);
+            activeDoc = null;
+            ReadComponent = null;
+            UpdateUI(null);
+            return 0;
+        }
+
+        public void UpdateUI(ModelDoc2 doc)
+        {
+            AlertSaveWindow();
+            LastReadDoc = ReadDoc;
+            ReadDoc = doc;
+            Dispatcher.Invoke(() =>
+            {
+                SwitchVisiable();
+                // LoadDocProperties();
+            });
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁闇�瑕佸脊绐楁彁绀轰繚瀛�
+        /// </summary>
+        public void AlertSaveWindow()
+        {
+            IPropertyOpt opt = ActiveOpter as IPropertyOpt;
+            if (opt != null && opt.GetDocChanged())
+            {
+                // 鍘嗗彶鏂囨。鐩存帴閲嶇疆
+                string fullName = Path.GetFileName(ReadDocPath);
+                if (NameUtil.IsHistoryDoc(fullName))
+                {
+                    opt.ResetProperty(out string errMsg);
+                    return;
+                }
+
+                string Message = $"{fullName}灞炴�у彂鐢熷彉鏇达紝鏄惁淇濆瓨?";
+                if (SwApp.SendMsgToUser2(Message, (int)swMessageBoxIcon_e.swMbWarning
+                   , (int)swMessageBoxBtn_e.swMbYesNo) == (int)swMessageBoxResult_e.swMbHitYes)
+                {
+                    SaveDoc(true);
+                }
+                else
+                {
+                    opt.ResetProperty(out string errMsg);
+                }
+            }
+        }
+
+        private int Ass_UserSelectionPostNotify()
+        {
+            var swSelMgr = (SelectionMgr)activeDoc.SelectionManager;
+            var i = swSelMgr.GetSelectedObjectCount2(-1);
+            if (i > 0)
+            {
+                try
+                {
+                    Component2 component = swSelMgr.GetSelectedObjectsComponent4(1, -1);
+                    ModelDoc2 doc = activeDoc;
+                    ReadComponent = null;
+                    if (component != null)
+                    {
+                        doc = component.IGetModelDoc();
+                        ReadComponent = component;
+                    }
+                    UpdateUI(doc);
+                }
+                catch (Exception ex)
+                {
+                    Logger.Error("Ass Change Component Error.", ex);
+                    this.Error($"鍒锋柊灞炴�уけ璐ワ紒{ex.Message}");
+                }
+            }
+            return 1;
+        }
+
+        /// <summary>
+        /// 鏍规嵁婵�娲荤殑鏂囨。绫诲瀷锛屽彉鏇村睘鎬у彲瑙�
+        /// </summary>
+        private void SwitchVisiable()
+        {
+            HashSet<string> skipName = new HashSet<string> {
+                NameConstant.materialCode
+            };
+
+            IPropertyOpt last = ActiveOpter as IPropertyOpt;
+            string contentKey = "default";
+            int? docType = ReadDoc?.GetType();
+            UserControl control;
+            IPropertyOpt newOne;
+            Dictionary<string, string> properties;
+            if (docType == (int)swDocumentTypes_e.swDocDRAWING)
+            {
+                ReadDocPath = ReadDoc.GetPathName();
+                contentKey = "default";
+                control = controlCache[contentKey];
+                newOne = control as IPropertyOpt;
+                newOne.SetProperties(null, "褰撳墠涓嶆敮鎸佸伐绋嬪浘", true, out _);
+            }
+            else if (docType == (int)swDocumentTypes_e.swDocPART)
+            {
+                ReadDocPath = ReadDoc.GetPathName();
+                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
+                string fileType = properties.Get(NameConstant.docType);
+                /*if (fileType == "鍔犲伐浠�" || fileType == "妯$粍")
+                {
+                    contentKey = "jgjPart";
+                }*/
+                if (BomIniterHolder.Instance.IsJgj(ReadDoc))
+                {
+                    contentKey = "jgjPart";
+                }
+                else
+                {
+                    contentKey = "standardPart";
+                }
+                control = controlCache[contentKey];
+                newOne = control as IPropertyOpt;
+                newOne.SetProperties(ReadDoc, properties, true, out _);
+            }
+            else if (docType == (int)swDocumentTypes_e.swDocASSEMBLY)
+            {
+                ReadDocPath = ReadDoc.GetPathName();
+                if (ReadDoc.IsOpenedViewOnly())
+                {
+                    contentKey = "default";
+                    control = controlCache[contentKey];
+                    newOne = control as IPropertyOpt;
+                    newOne.SetProperties(null, "褰撳墠澶勪簬鍙妯″紡", true, out _);
+                }
+                else if (ReadDoc.IsOpenedReadOnly())
+                {
+                    contentKey = "default";
+                    control = controlCache[contentKey];
+                    newOne = control as IPropertyOpt;
+                    newOne.SetProperties(null, "褰撳墠澶勪簬鍙妯″紡", true, out _);
+                }
+                else
+                {
+                    // !Equals(LastReadDoc, ReadDoc)
+                    properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
+                    string fileType = properties.Get(NameConstant.docType);
+                    /*if (fileType == "鍔犲伐浠�" || fileType == "妯$粍")
+                    {
+                        contentKey = "jgjPart";
+                    }*/
+                    if (BomIniterHolder.Instance.IsJgj(ReadDoc))
+                    {
+                        contentKey = "jgjModule";
+                    }
+                    else
+                    {
+                        contentKey = "standardModule";
+                    }
+                    control = controlCache[contentKey];
+                    newOne = control as IPropertyOpt;
+                    newOne.SetProperties(ReadDoc, properties, true, out _);
+                }
+            }
+            else
+            {
+                contentKey = "default";
+                control = controlCache[contentKey];
+                newOne = control as IPropertyOpt;
+
+                string PathName = ReadComponent?.GetPathName();
+                if (PathName == null)
+                {
+                    ReadDocPath = "";
+                    newOne.SetProperties(ReadDoc, "璇锋墦寮�涓�涓枃妗�", true, out _);
+                }
+                else
+                {
+                    ReadDocPath = PathName;
+                    string name = Path.GetFileNameWithoutExtension(PathName);
+                    newOne.SetProperties(ReadDoc, $"銆恵name}銆戞湭鎵惧埌鏂囨。锛岃妫�鏌ユ槸鍚﹁鍘嬬缉鎴栬交閲忓寲", true, out _);
+                }
+            }
+            if (last != null)
+            {
+                last.UpdateProperty -= Jgj_SinglePropertyChanged;
+                last = null;
+            }
+            ActiveOpter = control;
+            contentPanel.Children.Clear();
+            newOne.UpdateProperty += Jgj_SinglePropertyChanged;
+            contentPanel.Children.Add(control);
+        }
+
+        /// <summary>
+        /// 鏍规嵁婵�娲荤殑鏂囨。绫诲瀷锛屽彉鏇村睘鎬у彲瑙�
+        /// </summary>
+        private void SwitchVisiable2()
+        {
+            HashSet<string> skipName = new HashSet<string> {
+                NameConstant.materialCode
+            };
+
+            IPropertyOpt last = ActiveOpter as IPropertyOpt;
+            string contentKey = "default";
+            int? docType = ReadDoc?.GetType();
+            UserControl control;
+            IPropertyOpt newOne;
+            Dictionary<string, string> properties;
+            if (docType == (int)swDocumentTypes_e.swDocDRAWING)
+            {
+                ReadDocPath = ReadDoc.GetPathName();
+
+                control = new DefaultPanel();
+                newOne = control as IPropertyOpt;
+                newOne.SetSettings(settings);
+                newOne.SetProperties(null, "褰撳墠涓嶆敮鎸佸伐绋嬪浘", true, out _);
+            }
+            else if (docType == (int)swDocumentTypes_e.swDocPART)
+            {
+                ReadDocPath = ReadDoc.GetPathName();
+                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
+                string fileType = properties.Get(NameConstant.docType);
+                /*if (fileType == "鍔犲伐浠�" || fileType == "妯$粍")
+                {
+                    contentKey = "jgjPart";
+                }*/
+                if (BomIniterHolder.Instance.IsJgj(ReadDoc))
+                {
+                    control = new JgjPartPanel();
+                }
+                else
+                {
+                    control = new StandardPartPanel();
+                }
+                newOne = control as IPropertyOpt;
+                newOne.SetSettings(settings);
+                newOne.SetProperties(ReadDoc, properties, true, out _);
+            }
+            else if (docType == (int)swDocumentTypes_e.swDocASSEMBLY)
+            {
+                ReadDocPath = ReadDoc.GetPathName();
+                // !Equals(LastReadDoc, ReadDoc)
+                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
+                string fileType = properties.Get(NameConstant.docType);
+                /*if (fileType == "鍔犲伐浠�" || fileType == "妯$粍")
+                {
+                    contentKey = "jgjPart";
+                }*/
+                if (BomIniterHolder.Instance.IsJgj(ReadDoc))
+                {
+                    control = new JgjModulePanel();
+                }
+                else
+                {
+                    control = new StandardModulePanel();
+                }
+                newOne = control as IPropertyOpt;
+                newOne.SetSettings(settings);
+                newOne.SetProperties(ReadDoc, properties, true, out _);
+            }
+            else
+            {
+                control = new DefaultPanel();
+                newOne = control as IPropertyOpt;
+
+                string PathName = ReadComponent?.GetPathName();
+                if (PathName == null)
+                {
+                    ReadDocPath = "";
+                    newOne.SetSettings(settings);
+                    newOne.SetProperties(ReadDoc, "璇锋墦寮�涓�涓枃妗�", true, out _);
+                }
+                else
+                {
+                    ReadDocPath = PathName;
+                    string name = Path.GetFileNameWithoutExtension(PathName);
+                    newOne.SetSettings(settings);
+                    newOne.SetProperties(ReadDoc, $"銆恵name}銆戞湭鎵惧埌鏂囨。锛岃妫�鏌ユ槸鍚﹁鍘嬬缉鎴栬交閲忓寲", true, out _);
+                }
+            }
+            if (last != null)
+            {
+                last.UpdateProperty -= Jgj_SinglePropertyChanged;
+                last = null;
+            }
+            ActiveOpter = control;
+            contentPanel.Children.Clear();
+            newOne.UpdateProperty += Jgj_SinglePropertyChanged;
+            contentPanel.Children.Add(control);
+        }
+
+        /// <summary>
+        /// 浠庢縺娲荤殑鏂囨。涓鍙栧弬鏁�
+        /// </summary>
+        private void LoadDocProperties()
+        {
+            IPropertyOpt opt = ActiveOpter as IPropertyOpt;
+            string ErrMsg = null;
+            if (ReadDoc == null)
+            {
+                string PathName = ReadComponent?.GetPathName();
+                if (PathName == null)
+                {
+                    ReadDocPath = "";
+                    opt.SetProperties(ReadDoc, "璇锋墦寮�涓�涓枃妗�", true, out ErrMsg);
+                    return;
+                }
+                ReadDocPath = PathName;
+                string name = Path.GetFileNameWithoutExtension(PathName);
+                opt.SetProperties(ReadDoc, $"銆恵name}銆戞湭鎵惧埌鏂囨。锛岃妫�鏌ユ槸鍚﹁鍘嬬缉鎴栬交閲忓寲", true, out ErrMsg);
+                return;
+            }
+            int docType = ReadDoc.GetType();
+            ReadDocPath = ReadDoc.GetPathName();
+            if (docType == (int)swDocumentTypes_e.swDocDRAWING)
+            {
+                opt.SetProperties(null, "褰撳墠涓嶆敮鎸佸伐绋嬪浘", true, out ErrMsg);
+                return;
+            }
+            HashSet<string> skipName = new HashSet<string> {
+                NameConstant.materialCode
+            };
+            Dictionary<string, string> properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
+            opt.SetProperties(ReadDoc, properties, !Equals(LastReadDoc, ReadDoc), out ErrMsg);
+        }
+
+        private void ClearDocProperties()
+        {
+            IPropertyOpt opt = ActiveOpter as IPropertyOpt;
+            opt.ClearAllProperties(out string ErrMsg);
+        }
+
+        /// <summary>
+        /// 灏嗗睘鎬ц缃繘鏂囨。锛屾敞鎰忥紝骞舵病鏈変繚瀛�
+        /// </summary>
+        /// <param name="doc">鏂囨。</param>
+        private void SetDocProperty(ModelDoc2 doc, Dictionary<string, string> props)
+        {
+            CustomPropertyUtil.SetCustomProperties(doc, props);
+        }
+
+        public void SetSwApp(SldWorks SwApp)
+        {
+            this.SwApp = SwApp;
+        }
+
+
+        private void SaveDoc(bool qiaoqiaode)
+        {
+
+            int errors = 0, warnings = 0;
+
+            if ((ActiveOpter as IPropertyOpt).SaveDoc(ref errors, ref warnings))
+            {
+                // if (!qiaoqiaode) this.Info("淇濆瓨鎴愬姛");
+            }
+        }
+
+        private void SaveButton_Click(object sender, RoutedEventArgs e)
+        {
+            if (ReadDoc == null)
+            {
+                return;
+            }
+            SaveDoc(false);
+        }
+
+        public void RefreshData()
+        {
+            MaskAdorner.ShowMask(content, "灞炴�у姞杞戒腑锛岃绋嶅��...");
+            Task.Run(() =>
+            {
+                try
+                {
+                    UpdateActiveDoc();
+                }
+                catch (COMException come)
+                {
+                    // 棰戠箒鍏抽棴浼氭姏鍑鸿繖涓紓甯革紝涓嶇浜�
+                    Logger.Warn("Read property COMObject failed.", come);
+                }
+                catch (Exception ex)
+                {
+                    Logger.Error($"璇诲彇鍙傛暟寮傚父锛屾枃浠讹細[{ReadDocPath}]!", ex);
+                    this.Error($"璇诲彇鍙傛暟寮傚父锛歿ex.Message}");
+                }
+                finally
+                {
+                    MaskAdorner.HideMask(content);
+                }
+            });
+        }
+
+        private void Refresh_Click(object sender, RoutedEventArgs e)
+        {
+            RefreshData();
+        }
+
+        private void LoadComboBox_Click(object sender, RoutedEventArgs e)
+        {
+            MaskAdorner.ShowMask(content, "鍔犺浇MES璁剧疆锛岃绋嶅��...");
+            Task.Run(() =>
+            {
+                try
+                {
+                    LoadComboxItemSource();
+                }
+                finally
+                {
+                    MaskAdorner.HideMask(content);
+                }
+            });
+        }
+
+        private void PropertySettingControl_Initialized(object sender, EventArgs e)
+        {
+            InitPropertyData();
+        }
+
+        /// <summary>
+        /// 婵�娲荤殑鏂囨。鍙樻洿瑙﹀彂
+        /// </summary>
+        /// <param name="lastDoc"></param>
+        /// <param name="doc"></param>
+        /// <param name="comp"></param>
+        public void OnSwActiveDocChange(ModelDoc2 lastDoc, ModelDoc2 doc, Component2 comp)
+        {
+            // CurrentChanged();
+            RefreshData();
+        }
+
+        public void OnSwActiveDocSaved(ModelDoc2 doc, Component2 comp)
+        {
+            // 璇诲彇鏂囦欢锛岃缃弬鏁�
+            // LoadDocProperties();
+        }
+
+        public void OnCustomPropertyChange(string propName, string Configuration, string oldValue, string NewValue, int valueType)
+        {
+            if (oldValue == NewValue)
+            {
+                return;
+            }
+            IPropertyOpt opt = ActiveOpter as IPropertyOpt;
+            opt.UpdateSingleProperty(propName, NewValue);
+        }
+
+        public void OnDocDestroy(ModelDoc2 doc)
+        {
+
+        }
+
+        public void AfterDocDestroy()
+        {
+
+        }
+
+        public void OnTabControlSelectionChange(object sender, SelectionChangedEventArgs e)
+        {
+            if (e.RemovedItems == null)
+            {
+                return;
+            }
+
+            foreach (object obj in e.RemovedItems)
+            {
+                if (obj is TabItem item)
+                {
+                    if (item.Content == this)
+                    {
+                        AlertSaveWindow();
+                        break;
+                    }
+                }
+                else
+                {
+                    return;
+                }
+            }
+        }
+    }
+}
diff --git a/PdmSwPlugin.PropertySetting/Tab/JgjPartTab.xaml b/PdmSwPlugin.PropertySetting/Tab/JgjPartTab.xaml
new file mode 100644
index 0000000..86fa228
--- /dev/null
+++ b/PdmSwPlugin.PropertySetting/Tab/JgjPartTab.xaml
@@ -0,0 +1,88 @@
+锘�<UserControl x:Class="PdmSwPlugin.PropertySetting.Tab.JgjPartTab"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:PdmSwPlugin.PropertySetting.Tab"
+             mc:Ignorable="d" 
+             x:Name="self" d:DesignHeight="900" d:DesignWidth="800" Background="#FFF">
+    <UserControl.Resources>
+        <ResourceDictionary>
+            <ResourceDictionary.MergedDictionaries>
+                <ResourceDictionary Source="/PdmSwPlugin.Common;component/Style/ToolBar.xaml"/>
+                <ResourceDictionary Source="/PdmSwPlugin.Common;component/Style/ComboxStyle.xaml"/>
+            </ResourceDictionary.MergedDictionaries>
+        </ResourceDictionary>
+    </UserControl.Resources>
+
+    <StackPanel>
+        <StackPanel x:Name="materialCodePanel">
+            <Label Content="鐗╂枡缂栫爜"/>
+            <TextBox x:Name="materialCodeText" IsReadOnly="True" Text="{Binding materialCode,UpdateSourceTrigger=PropertyChanged}"/>
+        </StackPanel>
+
+        <StackPanel x:Name="weightPanel">
+            <Label Content="閲嶉噺锛坘g锛�"/>
+            <TextBox IsReadOnly="True" x:Name="weightText" Text="{Binding weight}"/>
+        </StackPanel>
+
+        <StackPanel x:Name="materialNamePanel">
+            <Label Content="鐗╂枡鍚嶇О"/>
+            <TextBox x:Name="materialNameText" Text="{Binding materialName,UpdateSourceTrigger=PropertyChanged}"/>
+        </StackPanel>
+
+        <StackPanel x:Name="jgjTypePanel">
+            <Label Content="鍔犲伐浠剁被鍨�"/>
+            <ComboBox x:Name="jgjTypeInput" Style="{StaticResource ShowTextCombox}"
+                      Text="{Binding jgjType,Mode=TwoWay}" 
+                      ItemsSource="{Binding jgjTypeItems}" />
+        </StackPanel>
+
+        <StackPanel x:Name="stuffPanel">
+            <Label Content="鏉愯川"/>
+            <ComboBox x:Name="stuffInput" Style="{StaticResource ShowTextCombox}" 
+                      Text="{Binding stuff,Mode=TwoWay}"
+                      ItemsSource="{Binding stuffItems}" 
+                      DropDownOpened="stuffInput_DropDownOpened"/>
+        </StackPanel>
+
+        <StackPanel x:Name="surfacePanel">
+            <Label Content="琛ㄩ潰澶勭悊"/>
+            <ComboBox x:Name="surfaceInput" Style="{StaticResource ShowTextCombox}" 
+                        Text="{Binding surface,Mode=TwoWay}" 
+                        ItemsSource="{Binding surfaceItems}" DropDownOpened="stuffInput_DropDownOpened"/>
+        </StackPanel>
+
+        <StackPanel x:Name="heatPanel">
+            <Label Content="鐑鐞�"/>
+            <ComboBox x:Name="heatInput" Style="{StaticResource ShowTextCombox}"
+                        Text="{Binding heat,Mode=TwoWay}" 
+                        ItemsSource="{Binding heatItems}" DropDownOpened="stuffInput_DropDownOpened"/>
+        </StackPanel>
+
+        <StackPanel x:Name="materialTypePanel">
+            <Label Content="鐗╂枡绫诲瀷"/>
+            <ComboBox ItemsSource="{Binding materialTypeItems}" SelectedItem="{Binding materialType,Mode=TwoWay}"/>
+        </StackPanel>
+
+        <StackPanel x:Name="createUserPanel">
+            <Label Content="璁捐浜哄憳"/>
+            <TextBox x:Name="createUserText" Text="{Binding designer,UpdateSourceTrigger=PropertyChanged}"/>
+        </StackPanel>
+
+        <StackPanel x:Name="remarkPanel">
+            <Label Content="澶囨敞"/>
+            <TextBox x:Name="remarkText" Text="{Binding remark,UpdateSourceTrigger=PropertyChanged}" />
+        </StackPanel>
+
+        <StackPanel x:Name="formatPanel">
+            <Label Content="鏂囦欢鏍煎紡"/>
+            <ComboBox ItemsSource="{Binding docTypeItems}" IsEnabled="{Binding DocTypeEnabled}"
+SelectedItem="{Binding docType,Mode=TwoWay}"/>
+        </StackPanel>
+
+        <StackPanel x:Name="versionChangePanel">
+            <CheckBox Content="鐗堟湰鍙樻洿" IsChecked="{Binding versionChangeBind}"/>
+        </StackPanel>
+    </StackPanel>
+</UserControl>
diff --git a/PdmSwPlugin.PropertySetting/Tab/JgjPartTab.xaml.cs b/PdmSwPlugin.PropertySetting/Tab/JgjPartTab.xaml.cs
new file mode 100644
index 0000000..cc1d149
--- /dev/null
+++ b/PdmSwPlugin.PropertySetting/Tab/JgjPartTab.xaml.cs
@@ -0,0 +1,473 @@
+锘縰sing PdmSwPlugin.Common.CustomHandler;
+using PdmSwPlugin.Common.Util;
+using PdmSwPlugin.PropertySetting.Entity;
+using PdmSwPlugin.PropertySetting.Interface;
+using PdmSwPlugin.PropertySetting.Panel.Attr;
+using SolidWorks.Interop.sldworks;
+using SolidWorks.Interop.swconst;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.IO;
+using System.Runtime.CompilerServices;
+using System.Windows.Controls;
+
+namespace PdmSwPlugin.PropertySetting.Tab
+{
+    /// <summary>
+    /// JgjPartTab.xaml 鐨勪氦浜掗�昏緫
+    /// </summary>
+    public partial class JgjPartTab : UserControl, INotifyPropertyChanged, IPropertyOpt
+    {
+        #region 涓嶈兘鍏敤鐨勪笢瑗匡紝鐪熸湁浣犵殑鍟奀#
+        public event PropertyChangedEventHandler PropertyChanged;
+        public void RaisePropertyChanged(string name)
+        {
+            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
+        }
+
+        public void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
+        {
+            old = @new;
+            if (propertyName != null)
+            {
+                RaisePropertyChanged(propertyName);
+                /*var attr = this.GetType().GetProperty(propertyName)?.GetCustomAttribute<PropertySettingAttr>();
+                if (attr == null)
+                {
+                    return;
+                }
+                if (attr.NeedSave)
+                {
+                    UpdateProperty?.Invoke(this, attr.Name, @new);
+                }*/
+            }
+        }
+        #endregion
+
+        public void ccc<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
+        {
+            old = @new;
+            if (propertyName != null)
+            {
+                RaisePropertyChanged(propertyName);
+            }
+        }
+
+        public event PanelPropertyChanged UpdateProperty;
+
+        /// <summary>
+        /// 鍒濆鏁版嵁
+        /// </summary>
+        private Dictionary<string, string> InitData = new Dictionary<string, string>();
+        /// <summary>
+        /// 瀹為檯鏁版嵁
+        /// </summary>
+        private Dictionary<string, string> SaveData = new Dictionary<string, string>();
+
+        private Dictionary<string, JgjType> datas;
+        private Dictionary<string, ObservableCollection<string>> stuffItemCache;
+
+        private Dictionary<string, ObservableCollection<string>> surfaceItemCache;
+
+        private Dictionary<string, ObservableCollection<string>> heatItemCache;
+
+        private ModelDoc2 doc;
+
+        #region 涓嬫媺妗嗘暟鎹簮
+        private ObservableCollection<string> _jgjTypeItems;
+        public ObservableCollection<string> jgjTypeItems
+        {
+            get => _jgjTypeItems;
+            set => RaiseAndSetIfChanged(ref _jgjTypeItems, value);
+        }
+
+        private ObservableCollection<string> _stuffItems;
+        public ObservableCollection<string> stuffItems
+        {
+            get => _stuffItems;
+            set => RaiseAndSetIfChanged(ref _stuffItems, value);
+        }
+
+        private ObservableCollection<string> _surfaceItems;
+        public ObservableCollection<string> surfaceItems
+        {
+            get => _surfaceItems;
+            set => RaiseAndSetIfChanged(ref _surfaceItems, value);
+        }
+
+        private ObservableCollection<string> _heatItems;
+        public ObservableCollection<string> heatItems
+        {
+            get => _heatItems;
+            set => RaiseAndSetIfChanged(ref _heatItems, value);
+        }
+
+        private ObservableCollection<string> _materialTypeItems = NameConstant.MaterialTypes;
+        public ObservableCollection<string> materialTypeItems
+        {
+            get => _materialTypeItems;
+            set => RaiseAndSetIfChanged(ref _materialTypeItems, value);
+        }
+
+        private ObservableCollection<string> _docTypeItems = NameConstant.DocTypes;
+        public ObservableCollection<string> docTypeItems
+        {
+            get => _docTypeItems;
+            set => RaiseAndSetIfChanged(ref _docTypeItems, value);
+        }
+        #endregion
+
+        private bool _docTypeEnabled = true;
+        [PropertySettingAttr(NeedInit = false, NeedSave = false)]
+        public bool DocTypeEnabled
+        {
+            get => _docTypeEnabled;
+            set => RaiseAndSetIfChanged(ref _docTypeEnabled, value);
+        }
+
+        #region UI灞炴��
+        private string _materialCode;
+        [PropertySettingAttr(Name = NameConstant.materialCode, defaultValue = "$PRP:\"SW-File Name\"")]
+        public string materialCode
+        {
+            get => _materialCode;
+            set
+            {
+                RaiseAndSetIfChanged(ref _materialCode, value);
+            }
+        }
+
+        private string _materialName;
+        [PropertySettingAttr(Name = NameConstant.materialName)]
+        public string materialName
+        {
+            get => _materialName;
+            set
+            {
+                RaiseAndSetIfChanged(ref _materialName, value);
+            }
+        }
+
+        private string _jgjType;
+        [PropertySettingAttr(Name = NameConstant.jgjType)]
+        public string jgjType
+        {
+            get => _jgjType;
+            set
+            {
+                string temp = value;// jgjTypeItems.Contains(value) ? value : "鏃�";
+                var datas = stuffItemCache.Get(temp, new ObservableCollection<string> { "鏃�" });
+                RaiseAndSetIfChanged(ref _stuffItems, datas, "stuffItems");
+                RaiseAndSetIfChanged(ref _jgjType, temp);
+                UpdateField("jgjType", temp);
+            }
+        }
+
+        private string _stuff;
+        [PropertySettingAttr(Name = NameConstant.stuff)]
+        public string stuff
+        {
+            get => _stuff;
+            set
+            {
+                string temp = value;// stuffItems.Contains(value) ? value : "鏃�";
+                var sDatas = surfaceItemCache.Get($"{jgjType}_{temp}", new ObservableCollection<string> { "鏃�" });
+                var hDatas = heatItemCache.Get($"{jgjType}_{temp}", new ObservableCollection<string> { "鏃�" });
+                ccc(ref _surfaceItems, sDatas, "surfaceItems");
+                ccc(ref _heatItems, hDatas, "heatItems");
+                ccc(ref _stuff, temp);
+            }
+        }
+
+        private string _surface;
+        [PropertySettingAttr(Name = NameConstant.surface)]
+        public string surface
+        {
+            get => _surface;
+            set
+            {
+                string temp = value;// surfaceItems.Contains(value) ? value : "鏃�";
+                ccc(ref _surface, temp);
+            }
+        }
+
+        private string _heat;
+        [PropertySettingAttr(Name = NameConstant.heat)]
+        public string heat
+        {
+            get => _heat;
+            set
+            {
+                string temp = value;// heatItems.Contains(value) ? value : "鏃�";
+                ccc(ref _heat, temp);
+            }
+        }
+
+        private string _weight = "";
+        [PropertySettingAttr(Name = NameConstant.weight, NeedSave = false)]
+        public string weight
+        {
+            get => CustomPropertyUtil.GetMass(doc);
+            set
+            {
+                ccc(ref _weight, value);
+            }
+        }
+
+        [PropertySettingAttr(Name = NameConstant.weight, NeedInit = false)]
+        public string weightEval
+        {
+            get => doc == null ? null : $"\"SW-璐ㄩ噺@{Path.GetFileName(doc.GetPathName())}\"";
+            set { }
+        }
+
+        private string _materialType = "";
+        [PropertySettingAttr(Name = NameConstant.materialType, defaultValue = "鏅�氫欢")]
+        public string materialType
+        {
+            get => _materialType;
+            set
+            {
+                RaiseAndSetIfChanged(ref _materialType, value);
+            }
+        }
+
+        private string _designer = "";
+        [PropertySettingAttr(Name = NameConstant.designer)]
+        public string designer
+        {
+            get => _designer;
+            set
+            {
+                RaiseAndSetIfChanged(ref _designer, value);
+            }
+        }
+
+        private string _remark = "";
+        [PropertySettingAttr(Name = NameConstant.remark)]
+        public string remark
+        {
+            get => _remark;
+            set
+            {
+                RaiseAndSetIfChanged(ref _remark, value);
+            }
+        }
+
+        private string _docType = "";
+        [PropertySettingAttr(Name = NameConstant.docType, defaultValue = "鍔犲伐浠�")]
+        public string docType
+        {
+            get => _docType;
+            set
+            {
+                string temp = value;
+                if (NameConstant.SpecialJgjType.Contains(jgjType))
+                {
+                    temp = "鍔犲伐浠�";
+                }
+                ccc(ref _docType, temp);
+            }
+        }
+
+        private string _versionChange = "0";
+        [PropertySettingAttr(Name = NameConstant.versionChange, defaultValue = "0")]
+        public string versionChange
+        {
+            get => _versionChange;
+            set
+            {
+                RaiseAndSetIfChanged(ref _versionChange, value);
+                RaiseAndSetIfChanged(ref _versionChangeBind, value == "1", "versionChangeBind");
+            }
+        }
+
+        private bool _versionChangeBind = false;
+        [PropertySettingAttr(Name = NameConstant.versionChange, NeedSave = false, NeedInit = false)]
+        public bool versionChangeBind
+        {
+            get => _versionChangeBind;
+            set
+            {
+                RaiseAndSetIfChanged(ref _versionChangeBind, value);
+                RaiseAndSetIfChanged(ref _versionChange, value ? "1" : "0", "versionChange");
+            }
+        }
+        #endregion
+
+        public JgjPartTab()
+        {
+            InitializeComponent();
+            DataContext = this;
+        }
+
+        /// <summary>
+        /// 璁剧疆灞炴��
+        /// </summary>
+        /// <param name="properties"></param>
+        /// <param name="errMsg"></param>
+        /// <returns></returns>
+        public bool SetProperties(ModelDoc2 doc, object properties, bool docChange, out string errMsg)
+        {
+            this.doc = doc;
+            var data = docChange ? InitData : null;
+            return NameConstant.SetProperties(this, properties, data, out errMsg);
+        }
+
+        public bool SaveDoc(ref int err, ref int warn)
+        {
+            Dictionary<string, string> props = GetAllProperties();
+            CustomPropertyUtil.SetCustomProperties(doc, props);
+            if (doc.Save3((int)swSaveAsOptions_e.swSaveAsOptions_AvoidRebuildOnSave,
+                    ref err, ref warn))
+            {
+                InitData = props;
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 鑾峰彇灞炴��
+        /// </summary>
+        /// <returns></returns>
+        public Dictionary<string, string> GetAllProperties()
+        {
+            return NameConstant.GetAllProperties(this);
+        }
+
+        public bool UpdateSingleProperty(string name, string value)
+        {
+            return NameConstant.UpdateSingleProperty(this, name, value);
+        }
+
+        public void RefreshItem()
+        {
+            if (datas == null)
+            {
+                return;
+            }
+            var finalStuffs = stuffItemCache.Get(jgjType, new ObservableCollection<string> { "鏃�" });
+            string key = $"{jgjType}_{stuff}";
+            var finalSurfaces = surfaceItemCache.Get(key, new ObservableCollection<string> { "鏃�" });
+            var finalHeats = heatItemCache.Get(key, new ObservableCollection<string> { "鏃�" });
+
+            Dispatcher.Invoke(() =>
+            {
+                stuffItems = finalStuffs;
+                surfaceItems = finalSurfaces;
+                heatItems = finalHeats;
+            });
+        }
+
+        public bool SetSettings(object settings)
+        {
+            Dictionary<string, JgjType> datas = settings as Dictionary<string, JgjType>;
+            this.datas = datas;
+
+            stuffItemCache = new Dictionary<string, ObservableCollection<string>>();
+
+            surfaceItemCache = new Dictionary<string, ObservableCollection<string>>();
+
+            heatItemCache = new Dictionary<string, ObservableCollection<string>>();
+
+            ObservableCollection<string> jgjTypes = new ObservableCollection<string> { "鏃�" };
+
+            foreach (string key in datas.Keys)
+            {
+                jgjTypes.Add(key);
+                JgjType type = datas[key];
+                ObservableCollection<string> stuffs = new ObservableCollection<string> { "鏃�" };
+
+                Dictionary<string, StuffType> stuffDatas = type.stuffMap;
+                foreach (string stuff in stuffDatas.Keys)
+                {
+                    if (stuff != "鏃�")
+                    {
+                        stuffs.Add(stuff);
+                    }
+                    StuffType stuffType = stuffDatas[stuff];
+                    string key2 = key + "_" + stuff;
+
+                    ObservableCollection<string> surfaces = new ObservableCollection<string> { "鏃�" };
+                    ObservableCollection<string> heats = new ObservableCollection<string> { "鏃�" };
+                    foreach (string surface in stuffType.surfaceParam)
+                    {
+                        if (surface != "鏃�") surfaces.Add(surface);
+                    }
+                    foreach (string heat in stuffType.heatParam)
+                    {
+                        if (heat != "鏃�") heats.Add(heat);
+                    }
+                    surfaceItemCache.Add(key2, surfaces);
+                    heatItemCache.Add(key2, heats);
+                }
+                stuffItemCache.Add(key, stuffs);
+                if (!stuffItemCache.ContainsKey("鏃�"))
+                {
+                    stuffItemCache.Add("鏃�", new ObservableCollection<string> { "鏃�" });
+                }
+            }
+
+            Dispatcher.Invoke(() =>
+            {
+                jgjTypeItems = jgjTypes;
+            });
+            return true;
+        }
+
+        public bool ClearAllProperties(out string ErrMsg)
+        {
+            ErrMsg = null;
+            return true;
+        }
+
+        public bool GetDocChanged()
+        {
+            return NameConstant.CompareWithInit(this, InitData);
+        }
+
+        public bool ResetProperty(out string errMsg)
+        {
+            return SetProperties(doc, InitData, false, out errMsg);
+        }
+
+        private void stuffInput_DropDownOpened(object sender, System.EventArgs e)
+        {
+            ComboBox comboBox = sender as ComboBox;
+            if (comboBox == null) return;
+            if (comboBox.Name == "stuffInput")
+            {
+                stuffItems = stuffItemCache.Get(jgjType, new ObservableCollection<string> { "鏃�" });
+            }
+            else if (comboBox.Name == "surfaceInput")
+            {
+                string key = $"{jgjType}_{stuff}";
+                surfaceItems = surfaceItemCache.Get(key, new ObservableCollection<string> { "鏃�" });
+            }
+            else if (comboBox.Name == "heatInput")
+            {
+                string key = $"{jgjType}_{stuff}";
+                heatItems = heatItemCache.Get(key, new ObservableCollection<string> { "鏃�" });
+            }
+        }
+
+        private void UpdateField(string field, string value)
+        {
+            if (field == "jgjType")
+            {
+                if (NameConstant.SpecialJgjType.Contains(value))
+                {
+                    docType = "鍔犲伐浠�";
+                    DocTypeEnabled = false;
+                }
+                else
+                {
+                    DocTypeEnabled = true;
+                }
+                return;
+            }
+        }
+    }
+}
diff --git a/SolidWorksListener/Listener.cs b/SolidWorksListener/Listener.cs
index 1719930..531f88a 100644
--- a/SolidWorksListener/Listener.cs
+++ b/SolidWorksListener/Listener.cs
@@ -6,6 +6,7 @@
 using System.Net;
 using System.Reflection;
 using System.Runtime.InteropServices;
+using System.Security.Principal;
 using System.Text;
 using System.Timers;
 using System.Windows;
@@ -84,7 +85,7 @@
             // WinAPI_Interop.ShowServiceMessage(msg, "鎻愮ず");
             // ShowMessageBox(msg, "鎻愮ず");
             string exeDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
-            string alertPath = Path.GetFullPath(Path.Combine(exeDir,"..","Alert.exe"));
+            string alertPath = Path.GetFullPath(Path.Combine(exeDir, "..", "Alert.exe"));
             if (File.Exists(alertPath))
             {
                 Process.Start(alertPath);
@@ -221,9 +222,16 @@
         private bool IsSwRunning()
         {
             Process[] ps = Process.GetProcessesByName("SLDWORKS");
-            bool IsRunning = (ps != null && ps.Length > 0);
+            bool IsRunning = false;
+            if (ps == null || ps.Length <= 0)
+            {
+                log.Debug($"Sw Is Running: {IsRunning}");
+                return false;
+            }
+            IsRunning = true;
+            string username = WindowsIdentity.GetCurrent().Name;
             log.Debug($"Sw Is Running: {IsRunning}");
-            return IsRunning;
+            return false;
         }
 
         /// <summary>
@@ -232,7 +240,7 @@
         private void HandleErr()
         {
             log.Debug($"err_count: {err_count}");
-            if (++err_count > 3)
+            if (++err_count > 5)
             {
                 if (IsSwRunning())
                 {
diff --git a/WpfUI/AsyncAttacher.cs b/WpfUI/AsyncAttacher.cs
index 68c6498..2fecf64 100644
--- a/WpfUI/AsyncAttacher.cs
+++ b/WpfUI/AsyncAttacher.cs
@@ -22,7 +22,7 @@
             
             while (modDoc != null)
             {
-                LimitedConcurrencyLevelTaskScheduler.Factory.StartNew(() => {
+                Task.Factory.StartNew(() => {
                     if (!OpenDocContext.IsOpenDoc(modDoc))
                     {
                         AttachModelDocEventHandler(modDoc);

--
Gitblit v1.9.1