chr
2025-01-03 31a636e735a0addc56e4f4527f500b7aa0874eb5
改了一大堆;
20个文件已修改
1297 ■■■■■ 已修改文件
.vs/SwPlugin/v17/DocumentLayout.backup.json 190 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/SwPlugin/v17/DocumentLayout.json 190 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
InnoSetupScript/PdmSwPlugin.iss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSw/SwAddin.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/BomIniter/NameUtil.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Util/CustomPropertyUtil.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Util/OpenDocContext.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Util/UI/MultiExWindow.xaml.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/Constant/PluginConst.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/EventHandler/BaseAttacher.cs 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/SwAddIn/MainControl.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PDM/Model/PdmControlModel.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PDM/PdmControl.xaml 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PDM/PdmControl.xaml.cs 325 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/SwPlugin/v17/DocumentLayout.backup.json
@@ -3,190 +3,64 @@
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\",
  "Documents": [
    {
      "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:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\panel\\jgjpartpanel.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:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\commonsettingcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\commonsettingcontrol.xaml.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:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    }
  ],
  "DocumentGroupContainers": [
    {
      "Orientation": 0,
      "Orientation": 1,
      "VerticalTabListWidth": 256,
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 4,
          "DockedHeight": 530,
          "SelectedChildIndex": 1,
          "Children": [
            {
              "$type": "Document",
              "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-31T09:12:36.773Z"
            },
            {
              "$type": "Document",
              "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": "AgIAALUEAAAAAAAAAAAuwMUEAABAAAAAAAAAAA==",
              "Title": "CommonSettingControl.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
              "ViewState": "AgIAAAoBAAAAAAAAAAD4vx0BAAAgAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "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"
              "WhenOpened": "2025-01-02T06:15:07.965Z",
              "EditorCaption": ""
            },
            {
              "$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==",
              "Title": "JgjPartPanel.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
              "ViewState": "AgIAAF4BAAAAAAAAAAAQwIABAABGAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-10-14T04:01:41.756Z",
              "WhenOpened": "2025-01-02T06:10:11.494Z",
              "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"
              "Title": "JgjPartPanel.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-01-02T06:07:52.955Z",
              "EditorCaption": ""
            }
          ]
        }
.vs/SwPlugin/v17/DocumentLayout.json
@@ -3,190 +3,64 @@
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\",
  "Documents": [
    {
      "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:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\panel\\jgjpartpanel.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:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\commonsettingcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\commonsettingcontrol.xaml.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:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    }
  ],
  "DocumentGroupContainers": [
    {
      "Orientation": 0,
      "Orientation": 1,
      "VerticalTabListWidth": 256,
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 4,
          "DockedHeight": 530,
          "SelectedChildIndex": 1,
          "Children": [
            {
              "$type": "Document",
              "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-31T09:12:36.773Z"
            },
            {
              "$type": "Document",
              "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": "AgIAALUEAAAAAAAAAAAuwMUEAABAAAAAAAAAAA==",
              "Title": "CommonSettingControl.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
              "ViewState": "AgIAAAoBAAAAAAAAAAD4vx0BAAAgAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "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"
              "WhenOpened": "2025-01-02T06:15:07.965Z",
              "EditorCaption": ""
            },
            {
              "$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==",
              "Title": "JgjPartPanel.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
              "ViewState": "AgIAAF4BAAAAAAAAAAAQwIABAABGAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-10-14T04:01:41.756Z",
              "WhenOpened": "2025-01-02T06:10:11.494Z",
              "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"
              "Title": "JgjPartPanel.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-01-02T06:07:52.955Z",
              "EditorCaption": ""
            }
          ]
        }
InnoSetupScript/PdmSwPlugin.iss
@@ -7,7 +7,7 @@
; 自动更新程序路径
#define AutoUpdaterDir = "D:\Workspace\PdmSwPlugin2\PdmSw\bin\x64\Release\AutoUpdater\"
; 版本
#define Version = "_0.0.0.43_改"
#define Version = "_0.0.0.45_审核质量"
; 生成的Installer存放路径
#define OutPutDir = "Z:\Output"
PdmSw/SwAddin.cs
@@ -294,6 +294,7 @@
                KeyPreview = true,
                Dock = DockStyle.Fill
            };
            mainForm.FormClosed += MainForm_FormClosed;
            mainForm.Controls.Add(host);
            IntPtr ptr = mainForm.Handle;
            // IntPtr ptr = WindowIntPtrUtil.FindWindow(null, "Window1");
@@ -301,6 +302,12 @@
            mainForm.WindowState = FormWindowState.Maximized;
        }
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            /// 关闭时先执行DeActiveHandler,然后执行这个
        }
        private void LoadPlugins()
        {
            // 读图,估计是panel的图标
PdmSwPlugin.Common/BomIniter/NameUtil.cs
@@ -1,5 +1,6 @@
using PdmSwPlugin.Common.Setting;
using System;
using System.Text.RegularExpressions;
namespace PdmSwPlugin.Common
{
PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs
@@ -27,12 +27,14 @@
            string jgjNameRegx = CustomerSetting.Instance["jgjNameRegx"];
            string standardNameRegx = CustomerSetting.Instance["standardNameRegx"];
            string specialJgjRegx = CustomerSetting.Instance["specialJgjRegx"];
            if (Regex.IsMatch(childName, jgjNameRegx))
            {
                if (bom._drawInfo != null)
                {
                    bom._drawInfo.HistoryData = NameUtil.IsHistoryDoc(childName);
                    bom._drawInfo.isSpecial = Regex.IsMatch(childName, specialJgjRegx);
                }
                string docType = bom.properties.Get("文件格式");
PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs
@@ -55,7 +55,7 @@
            InitializeComponent();
            this.title = title;
            DataContext = this;
            if (hisList == null)
            if (hisList == null || hisList.Count <= 0)
            {
                this.HisList = new ObservableCollection<DrawAuditHis>();
            }
PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs
@@ -85,6 +85,14 @@
            set => RaiseAndSetIfChanged(ref _status, value);
        }
        private bool? _inKeeDeeDb;
        public bool? inKeeDeeDb
        {
            get => _inKeeDeeDb;
            set => RaiseAndSetIfChanged(ref _inKeeDeeDb, value);
        }
        private string _auditId;
        public string auditId
        {
@@ -116,6 +124,26 @@
    /// </summary>
    public class DrawInfo : NotifyBase
    {
        /// <summary>
        /// true说明没有工程图
        /// </summary>
        public bool _noDrw = false;
        public bool noDrw
        {
            get => _noDrw;
            set => RaiseAndSetIfChanged(ref _noDrw, value);
        }
        public bool _inKeeDeeDb = false;
        private bool _isSpecial;
        public bool isSpecial
        {
            get => _isSpecial;
            set => RaiseAndSetIfChanged(ref _isSpecial, value);
        }
        /// <summary>
        /// 3Dmd5
        /// </summary>
@@ -169,6 +197,10 @@
        public List<string> errMessages { get; set; }
        public Dictionary<string, string> allProperties { get; set; }
        /// <summary>
        /// 为True说明没有工程图
        /// </summary>
    }
    [Serializable]
@@ -197,6 +229,11 @@
            set => RaiseAndSetIfChanged(ref _treeId, value);
        }
        /// <summary>
        /// true说明没有工程图
        /// </summary>
        public bool noDrw => (_drawInfo?.noDrw == true);
        public string id => BomInfo?.id;
        public string name => BomInfo?.name;
        public string partNo => BomInfo?.partNo;
@@ -222,10 +259,6 @@
        public string checkUserId => BomInfo?.checkUserId;
        public string checkUserName => BomInfo?.checkUserName;
        #region 规则检查相关字段
        #endregion
        #region 图纸审核相关字段
        public string drawStatus => BomInfo?.status;
        public string requestUserId => BomInfo?.requestUserId;
@@ -244,8 +277,15 @@
        /// <summary>
        /// 图纸是否发生变更 非历史图纸看2D图MD5 历史图纸看一致性检查没通过
        /// </summary>
        public bool localDocChanged => (!IsHistoryData && localD2Md5 != _drawInfo?.d2Md5)
            || (IsHistoryData && _drawInfo?.checkRuleResult == 2); //localD3Md5 != _drawInfo?.d3Md5;
        public bool localDocChanged
        {
            get
            {
                //if (!IsHistoryData) return localD2Md5 != _drawInfo?.d2Md5; //(!IsHistoryData && localD2Md5 != _drawInfo?.d2Md5)
                //return (IsHistoryData && _drawInfo?.checkRuleResult == 2);
                return false;
            }
        }
        /// <summary>
        /// 规则检查结果
        /// </summary>
@@ -277,24 +317,29 @@
            {
                // 找不到文档的不审核
                if (lost) return false;
                // 不在物料明细表中不审核
                if (ExcludeFromBOM) return false;
                // 模组不审核
                if (produceWay == "模组") return false;
                // 跳过检查的不审
                if (skipCheck) return false;
                // 进入系统的不审核
                if (BomInfo.inKeeDeeDb == true) return false;
                //if (_drawInfo.isSpecial) return false;
                // 待审核的不重复提交
                if (drawStatus == "submitted" || drawStatus == "resubmitted") return false;
                if (IsHistoryData)
                {
                    // 历史图纸只审核一致性不通过的 和被驳回的
                    return _drawInfo.checkRuleResult == 2 || drawStatus == "rejected";
                }
                else
                {
                    // 非历史图纸只审核 允许审核的加工件
                    return produceWay == "加工件"
                            && (drawStatus != "submitted" && drawStatus != "resubmitted")
                            && (drawStatus != "completed" || localDocChanged);
                }
                return produceWay == "加工件" && (drawStatus != "submitted" && drawStatus != "resubmitted")
                            && (drawStatus != "completed");
                /// 以前还要分图纸变更,现在不弄了
                //if (IsHistoryData)
                //{
                //    // 历史图纸只审核一致性不通过的 和被驳回的
                //    return _drawInfo.checkRuleResult == 2 || drawStatus == "rejected";
                //}
                //else
                //{
                //    // 非历史图纸只审核 允许审核的加工件
                //    return produceWay == "加工件"
                //            && (drawStatus != "submitted" && drawStatus != "resubmitted")
                //            && (drawStatus != "completed" || localDocChanged);
                //}
            }
        }
@@ -304,18 +349,18 @@
        /// <returns></returns>
        public string NeedStopCheckIn()
        {
            if (produceWay == "模组") return null;
            if (ExcludeFromBOM) return null;
            if (skipCheck) return null;
            if (BomInfo.inKeeDeeDb == true) return null;
            if (IsHistoryData)
            {
                bool err = false;
                string msg = $"历史图纸【{partModel}】";
                if (localDocChanged)
                if (localDocChanged && !noDrw)
                {
                    err = true;
                    msg += "变更后未重新审核;";
                }
                else if (drawStatus == "rejected" || drawStatus == "submitted" || drawStatus == "resubmitted")
                if ((drawStatus == "rejected" || drawStatus == "submitted" || drawStatus == "resubmitted") && BomInfo.inKeeDeeDb != true)
                {
                    err = true;
                    msg += "未通过审核";
@@ -325,6 +370,11 @@
                {
                    err = true;
                    msg += "被隐藏;";
                }
                if (noDrw)
                {
                    err = true;
                    msg += "未找到工程图";
                }
                return err ? msg : null;
            }
@@ -342,16 +392,21 @@
                    error = true;
                    msg += "被隐藏;";
                }
                if (produceWay == "加工件" && drawStatus != "completed")
                if (produceWay == "加工件" && drawStatus != "completed" && BomInfo.inKeeDeeDb != true)
                {
                    error = true;
                    msg += "未通过审核;";
                }
                if (produceWay == "加工件" && drawStatus == "completed" && localDocChanged)
                if (produceWay == "加工件" && drawStatus == "completed" && localDocChanged && !noDrw)
                {
                    error = true;
                    msg += "图纸变更后未重新审核";
                }
                if (noDrw)
                {
                    error = true;
                    msg += "未找到工程图";
                }
                return error ? msg : null;
            }
            return null;
PdmSwPlugin.Common/Util/CustomPropertyUtil.cs
@@ -212,8 +212,9 @@
        /// </summary>
        /// <param name="doc"></param>
        /// <returns></returns>
        public static bool ClearAllCustomProperties(ModelDoc2 doc)
        public static bool ClearAllCustomProperties(ModelDoc2 doc, out bool needSave)
        {
            needSave = false;
            if (doc == null) return false;
            Configuration activeConfig = doc.GetActiveConfiguration() as Configuration;
            if (activeConfig == null)
@@ -230,8 +231,8 @@
            }
            foreach (var name in names)
            {
                cpm.Delete2(name);
                needSave = true;
            }
            return true;
        }
PdmSwPlugin.Common/Util/OpenDocContext.cs
@@ -5,18 +5,20 @@
{
    public class OpenDocContext
    {
        public static readonly Hashtable OpenDocs = new Hashtable();
        public static readonly Hashtable OpenDocs = Hashtable.Synchronized(new Hashtable());
        public static void AddDoc(ModelDoc2 doc, object handler) {
        public static void AddDoc(ModelDoc2 doc, object handler)
        {
            OpenDocs.Add(doc, handler);
        }
        public static bool IsOpenDoc(ModelDoc2 doc) {
        public static bool IsOpenDoc(ModelDoc2 doc)
        {
            return OpenDocs.ContainsKey(doc);
        }
        public static void RemoveDoc(ModelDoc2 doc)
        {
        {
            OpenDocs.Remove(doc);
        }
PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs
@@ -41,6 +41,8 @@
        private int bomOrder = 0;
        public ConcurrentQueue<string> needSaveList { get; set; } = new ConcurrentQueue<string>();
        /// <summary>
        /// 多线程从打开的根文档中读取BOM信息
        /// </summary>
@@ -59,10 +61,22 @@
            {
                return;
            }
            CustomPropertyUtil.ClearAllCustomProperties(sldDoc);
            Component2 rootComponent = activeConfiguration.GetRootComponent3(false);
            string path = rootComponent.GetPathName();
            CustomPropertyUtil.ClearAllCustomProperties(sldDoc, out bool needSave);
            if (needSave)
            {
                int err = 0, warn = 0;
                if (sldDoc.Save3((int)swSaveAsOptions_e.swSaveAsOptions_AvoidRebuildOnSave, ref err, ref warn))
                {
                    needSaveList.Enqueue(path);
                }
                else
                {
                    needSaveList.Enqueue($"{path}自动保存失败,异常代码:{err}");
                }
            }
            BomInfo bomInfo = GetBomInfoFromDoc(rootComponent);
            PdmBom bom = ConcatCacheBom(bomInfo, 0, null, rootComponent);
@@ -123,9 +137,22 @@
                {
                    Component2 childComponent = child as Component2;
                    ModelDoc2 childDoc = childComponent.GetModelDoc2();
                    // 清楚格式不对的属性
                    CustomPropertyUtil.ClearAllCustomProperties(childDoc);
                    string childPath = childComponent.GetPathName();
                    // 清除格式不对的属性
                    CustomPropertyUtil.ClearAllCustomProperties(childDoc, out bool needSave);
                    if (needSave)
                    {
                        int err = 0, warn = 0;
                        if (childDoc.Save3((int)swSaveAsOptions_e.swSaveAsOptions_AvoidRebuildOnSave, ref err, ref warn))
                        {
                            needSaveList.Enqueue(childPath);
                        }
                        else
                        {
                            needSaveList.Enqueue($"{childPath}自动保存失败,异常代码:{err}");
                        }
                    }
                    PdmBom bom = null;
                    if (BomInfoCache.ContainsKey(childPath))
                    {
@@ -203,6 +230,7 @@
            CacheList = new ConcurrentQueue<PdmBom>();
            TreeList = new ConcurrentQueue<PdmBom>();
            BomInfoCache = new ConcurrentDictionary<string, BomInfo>();
            needSaveList = new ConcurrentQueue<string>();
            GetBomsFromDocAsync(doc);
            return TreeList.OrderBy(e => e.name).ToList(); ;
        }
@@ -216,7 +244,7 @@
            ModelDoc2 doc = component.GetModelDoc2();
            // 直接用文件名,以免 SolidWorks 因为有多个相同文件而把 Name2 加了 -N 的后缀名
            string childPath = component.GetPathName();
            string childName = Path.GetFileNameWithoutExtension(childPath);
            string childName = System.IO.Path.GetFileNameWithoutExtension(childPath);
            if (ModelUtil.Is_Mn(childName))
            {
PdmSwPlugin.Common/Util/UI/MultiExWindow.xaml.cs
@@ -38,6 +38,13 @@
            set => RaiseAndSetIfChanged(ref _title, value);
        }
        private string _header;
        public string header
        {
            get => _header;
            set => RaiseAndSetIfChanged(ref _header, value);
        }
        private ObservableCollection<string> _exceptions;
        public ObservableCollection<string> exceptions
@@ -47,11 +54,13 @@
        }
        public MultiExWindow(DependencyObject parent, string title, List<string> exceptions)
        public MultiExWindow(DependencyObject parent, string title, List<string> exceptions,string header = "异常信息")
        {
            this.title = title;
            this.header = header;
            InitializeComponent();
            DataContext = this;
            table.Columns[0].Header = header;
            if (exceptions == null)
            {
                this.exceptions = new ObservableCollection<string>();
PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs
@@ -385,17 +385,28 @@
                            this.Error($"服务器中未找到图纸文件,路径:{filePath}");
                            return;
                        }
                        double[] massData = SwDMUtil.GetMassProperty(filePath, out string errMsg);
                        if (massData == null)
                        try
                        {
                            this.Error($"获取图纸一致性数据失败!{errMsg}");
                            return;
                            double[] massData = SwDMUtil.GetMassProperty(filePath, out string errMsg);
                            if (massData == null)
                            {
                                //this.Error($"获取图纸一致性数据失败!{errMsg}");
                                //return;
                                throw new Exception(errMsg);
                            }
                            da.fileName = Path.GetFileName(filePath);
                            da.volume = NumberUtil.HandleMass(massData[3]);
                            da.surfaceArea = NumberUtil.HandleMass(massData[4]);
                            da.mass = NumberUtil.HandleMass(massData[5]);
                        }
                        da.fileName = Path.GetFileName(filePath);
                        da.volume = NumberUtil.HandleMass(massData[3]);
                        da.surfaceArea = NumberUtil.HandleMass(massData[4]);
                        da.mass = NumberUtil.HandleMass(massData[5]);
                        catch (Exception ex)
                        {
                            Logger.Warn("Get Doc Mass Data Failed.", ex);
                            da.fileName = Path.GetFileName(filePath);
                            da.volume = 0;
                            da.surfaceArea = 0;
                            da.mass = 0;
                        }
                        da.pass = true;
                        Result<object> res = Client.PostSyncAction<object>(da, "drawAudit/complete");
                        object obj = res.HandleResult();
@@ -533,6 +544,8 @@
        public void OnSwActiveDocChange(ModelDoc2 oldDoc, ModelDoc2 newDoc, Component2 comp)
        {
            long start = DateTime.Now.Millisecond;
            Logger.Debug("Find Open Doc Start...");
            string path = newDoc.GetPathName();
            Uri fileName;
            if (string.IsNullOrEmpty(path))
@@ -549,6 +562,7 @@
                var d3Path = new Uri(GetRealFilePath(e.d3RelativePath));
                e.IsOpening = fileName == d2Path || fileName == d3Path;
            }
            Logger.Debug($"Find Open Doc {path} End {DateTime.Now.Millisecond - start}ms.");
        }
        public void OnSwActiveDocSaved(ModelDoc2 doc, Component2 comp)
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.44";
        public static readonly string Version = "0.0.0.45";
    }
}
PdmSwPlugin.Main/EventHandler/BaseAttacher.cs
@@ -4,10 +4,14 @@
using SolidWorks.Interop.swconst;
using System;
using System.Collections;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace PdmSwPlugin.Main.EventHandler
{
    /// <summary>
    /// 事件附加器
    /// </summary>
    public class BaseAttacher : IEventAttacher, IDocEventHandler
    {
        public static ILog Logger { get; } = LogManager.GetLogger("SwAddin");
@@ -33,8 +37,9 @@
        /// <returns></returns>
        public virtual bool AttachEventHandlers()
        {
            // 添加应用事件监听
            AttachSwEvents();
            //Listen for events on all currently open docs
            // 添加文档事件监听
            AttachEventsToAllDocuments();
            return true;
        }
@@ -60,14 +65,55 @@
        private bool AttachEventsToAllDocuments()
        {
            ModelDoc2 modDoc = (ModelDoc2)SwApp.GetFirstDocument();
            while (modDoc != null)
            //ModelDoc2 modDoc = (ModelDoc2)SwApp.GetFirstDocument();
            //while (modDoc != null)
            //{
            //    if (!OpenDocContext.IsOpenDoc(modDoc))
            //    {
            //        AttachModelDocEventHandler(modDoc);
            //    }
            //    modDoc = (ModelDoc2)modDoc.GetNext();
            //}
            /// 试一下异步附加事件
            var objs = SwApp.GetDocuments();
            if (objs != null && objs.Length > 0)
            {
                if (!OpenDocContext.IsOpenDoc(modDoc))
                Task[] tasks = new Task[objs.Length];
                for (int i = 0; i < objs.Length; i++)
                {
                    AttachModelDocEventHandler(modDoc);
                    var obj = objs[i];
                    if (obj is ModelDoc2 modDoc)
                    {
                        tasks[i] = Task.Run(() =>
                        {
                            if (!OpenDocContext.IsOpenDoc(modDoc))
                            {
                                AttachModelDocEventHandler(modDoc);
                            }
                        });
                    }
                }
                modDoc = (ModelDoc2)modDoc.GetNext();
                Task.WaitAll(tasks);
            }
            return true;
        }
        private bool AttachEventsToAllDocuments(ModelDoc2 modDoc)
        {
            if (!OpenDocContext.IsOpenDoc(modDoc))
            {
                AttachModelDocEventHandler(modDoc);
            }
            return true;
        }
        private bool AttachEventsToAllDocuments(string fileName)
        {
            ModelDoc2 modDoc = SwApp.GetOpenDocument(fileName);
            if (!OpenDocContext.IsOpenDoc(modDoc))
            {
                AttachModelDocEventHandler(modDoc);
            }
            return true;
        }
@@ -208,7 +254,7 @@
        public int OnFileNew(object newDoc, int docType, string templateName)
        {
            AttachEventsToAllDocuments();
            AttachEventsToAllDocuments((ModelDoc2)newDoc);
            return 0;
        }
@@ -217,7 +263,13 @@
            return 0;
        }
        public int FileOpenPostNotify(string FileName)
        /// <summary>
        /// Post-notifies an application when a file has been opened.
        /// 在打开文件时 Post-通知应用程序。
        /// </summary>
        /// <param name="FileName"></param>
        /// <returns></returns>
        public int FileOpenPostNotify(string filePath)
        {
            AttachEventsToAllDocuments();
            return 0;
PdmSwPlugin.Main/SwAddIn/MainControl.cs
@@ -365,19 +365,29 @@
        public void DeActiveHandler()
        {
            foreach (TabItem item in mainTab.tabControl.Items)
            try
            {
                // 向主Control注册事件
                if (item.Content is IActiveDocChangeHandler handler)
                if (mainTab?.tabControl != null)
                {
                    ActiveDocChangeEvent -= handler.OnSwActiveDocChange;
                    ActiveDocSavedEvent -= handler.OnSwActiveDocSaved;
                    ActiveDocCustomPropertyChange -= handler.OnCustomPropertyChange;
                    DocDestroy -= handler.OnDocDestroy;
                    AfterDocDestroy -= handler.AfterDocDestroy;
                    foreach (TabItem item in mainTab.tabControl.Items)
                    {
                        // 向主Control注册事件
                        if (item.Content is IActiveDocChangeHandler handler)
                        {
                            ActiveDocChangeEvent -= handler.OnSwActiveDocChange;
                            ActiveDocSavedEvent -= handler.OnSwActiveDocSaved;
                            ActiveDocCustomPropertyChange -= handler.OnCustomPropertyChange;
                            DocDestroy -= handler.OnDocDestroy;
                            AfterDocDestroy -= handler.AfterDocDestroy;
                        }
                    }
                    PluginInfos.Clear();
                }
            }
            PluginInfos.Clear();
            catch (Exception ex)
            {
                Logger.Error("DeActiveHandler Failed.", ex);
            }
        }
        /// <summary>
PdmSwPlugin.PDM/Model/PdmControlModel.cs
@@ -44,7 +44,8 @@
        public ObservableCollection<PdmBom> BomTree
        {
            get => _bomTree;
            set {
            set
            {
                RaiseAndSetIfChanged(ref _bomTree, value);
                int count = CacheList != null ? CacheList.Count : 0;
                AllBomCount = $"共 {count} 条";
@@ -52,8 +53,9 @@
            }
        }
        public void RefreshSelectedBomCount() {
            int count = CacheList != null ? CacheList.Where(e=>e.selected).Count() : 0;
        public void RefreshSelectedBomCount()
        {
            int count = CacheList != null ? CacheList.Where(e => e.selected).Count() : 0;
            SelectedBomCount = $"已选中 {count} 条";
        }
@@ -93,7 +95,7 @@
        private Dictionary<string, BomInfo> GetBomsFromWeb(HttpClient Client, PdmBomParam param)
        {
            Result<Dictionary<string, BomInfo>> result =
                    Client.PostSyncAction<Dictionary<string, BomInfo>>(param, "wpf/bom/openApi/bomInfo2");
                    Client.PostSyncAction<Dictionary<string, BomInfo>>(param, "wpf/bom/openApi/bomInfo3");
            Dictionary<string, BomInfo> bomInfo = result.HandleResult();
            return bomInfo;
        }
@@ -113,7 +115,7 @@
                allModels = models
            };
            Result<Dictionary<string, BomInfo>> result =
                    Client.PostSyncAction<Dictionary<string, BomInfo>>(param, "wpf/bom/openApi/bomInfo2");
                    Client.PostSyncAction<Dictionary<string, BomInfo>>(param, "wpf/bom/openApi/bomInfo3");
            Dictionary<string, BomInfo> bomInfos = result.HandleResult();
            Dictionary<string, DrawInfo> drawInfos = new Dictionary<string, DrawInfo>();
            FillBomInfo(BomTree.ToList(), bomInfos, drawInfos);
@@ -143,19 +145,22 @@
                {
                    info = bomInfos[partModel];
                    bom.inDb = true;
                    //bom.BomInfo = info;
                    bom.BomInfo.id = info.id;
                    bom.BomInfo.bomVersion = info.bomVersion;
                    bom.BomInfo.checkStatus = info.checkStatus;
                    bom.BomInfo.checkUserId = info.checkUserId;
                    bom.BomInfo.checkUserName = info.checkUserName;
                    if (!string.IsNullOrEmpty(info.id))
                    {
                        //bom.BomInfo = info;
                        bom.BomInfo.id = info.id;
                        bom.BomInfo.bomVersion = info.bomVersion;
                        bom.BomInfo.checkStatus = info.checkStatus;
                        bom.BomInfo.checkUserId = info.checkUserId;
                        bom.BomInfo.checkUserName = info.checkUserName;
                    bom.BomInfo.status = info.status;
                    bom.BomInfo.requestUserId = info.requestUserId;
                    bom.BomInfo.requestUser = info.requestUser;
                    bom.BomInfo.auditUserId = info.auditUserId;
                    bom.BomInfo.auditUser = info.auditUser;
                        bom.BomInfo.status = info.status;
                        bom.BomInfo.requestUserId = info.requestUserId;
                        bom.BomInfo.requestUser = info.requestUser;
                        bom.BomInfo.auditUserId = info.auditUserId;
                        bom.BomInfo.auditUser = info.auditUser;
                    }
                    bom.BomInfo.inKeeDeeDb = info.inKeeDeeDb;
                }
                else
                {
PdmSwPlugin.PDM/PdmControl.xaml
@@ -117,6 +117,47 @@
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Gray"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding drawInfo.noDrw}" Value="true">
                        <Setter Property="Text" Value="未通过"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Red"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding skipCheck}" Value="true">
                        <Setter Property="Text" Value="无需检查"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Gray"/>
                    </DataTrigger>
                    <!--<MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsHistoryData}" Value="true"/>
                            <Condition Binding="{Binding drawInfo.noDrw}" Value="false"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Text" Value="无需检查"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Gray"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsHistoryData}" Value="true"/>
                            <Condition Binding="{Binding drawInfo.noDrw}" Value="true"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Text" Value="未通过"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Red"/>
                    </MultiDataTrigger>-->
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding BomInfo.inKeeDeeDb}" Value="true"/>
                            <Condition Binding="{Binding drawInfo.noDrw}" Value="false"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Text" Value="已入系统"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="DarkGreen"/>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
@@ -125,7 +166,7 @@
                <Setter Property="Foreground" Value="Black"/>
                <Setter Property="Background" Value="White"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding produceWay}" Value="模组">
                    <DataTrigger Binding="{Binding skipCheck}" Value="true">
                        <Setter Property="Text" Value="无需审核"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Gray"/>
@@ -137,7 +178,13 @@
                        <Setter Property="Background" Value="Gray"/>
                    </DataTrigger>
                    <MultiDataTrigger>
                    <DataTrigger Binding="{Binding drawInfo.isSpecial}" Value="True">
                        <Setter Property="Text" Value="无需审核"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Gray"/>
                    </DataTrigger>
                    <!--<MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding drawInfo.HistoryData}" Value="true"/>
                            <Condition Binding="{Binding localDocChanged}" Value="false"/>
@@ -145,16 +192,41 @@
                        <Setter Property="Text" Value="无需审核"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Gray"/>
                    </MultiDataTrigger>
                    </MultiDataTrigger>-->
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding drawInfo.HistoryData}" Value="true"/>
                            <Condition Binding="{Binding localDocChanged}" Value="true"/>
                            <Condition Binding="{Binding drawInfo.noDrw}" Value="false"/>
                            <Condition Binding="{Binding skipCheck}" Value="false"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Text" Value="历史图纸变更"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Blue"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding BomInfo.status}" Value="completed"/>
                            <Condition Binding="{Binding localDocChanged}" Value="true"/>
                            <Condition Binding="{Binding drawInfo.noDrw}" Value="false"/>
                            <Condition Binding="{Binding skipCheck}" Value="false"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Text" Value="文档变更"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Blue"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding skipCheck}" Value="false"/>
                            <Condition Binding="{Binding drawInfo.noDrw}" Value="true"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Text" Value="未找到工程图"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Red"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
@@ -165,16 +237,6 @@
                        <Setter Property="Text" Value="已通过"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Green"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding BomInfo.status}" Value="completed"/>
                            <Condition Binding="{Binding localDocChanged}" Value="true"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Text" Value="文档变更"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Blue"/>
                    </MultiDataTrigger>
                    <DataTrigger Binding="{Binding BomInfo.status}" Value="submitted">
@@ -192,6 +254,16 @@
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="Red"/>
                    </DataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding BomInfo.inKeeDeeDb}" Value="true"/>
                            <Condition Binding="{Binding drawInfo.noDrw}" Value="false"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Text" Value="已入系统"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="DarkGreen"/>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
PdmSwPlugin.PDM/PdmControl.xaml.cs
@@ -1,45 +1,40 @@
using PdmSwPlugin.Common.Interface;
using SolidWorks.Interop.sldworks;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Controls;
using PdmSwPlugin.Common;
using System.Collections.ObjectModel;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows;
using System;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
using log4net;
using Microsoft.Win32;
using NPOI.SS.UserModel;
using NPOI.Util;
using NPOI.XSSF.UserModel;
using PdmSwPlugin.Commmon.Control;
using PdmSwPlugin.Commmon.Util.UI;
using PdmSwPlugin.Common;
using PdmSwPlugin.Common.Constants;
using System.Threading;
using log4net;
using PdmSwPlugin.Common.Control.TreeGrid;
using PdmSwPlugin.Common.Entity.DrawAudit;
using PdmSwPlugin.Common.Entity.Pdm;
using PdmSwPlugin.Common.Entity.System;
using PdmSwPlugin.Common.Interface;
using PdmSwPlugin.Common.Setting;
using PdmSwPlugin.Common.Util;
using PdmSwPlugin.Common.Util.Http;
using PdmSwPlugin.Commmon.Util.UI;
using PdmSwPlugin.Common.Entity.Pdm;
using PdmSwPlugin.Common.Control.TreeGrid;
using System.Windows.Data;
using SolidWorks.Interop.swconst;
using PdmSwPlugin.Common.Entity.DrawAudit;
using System.Collections.Concurrent;
using PdmSwPlugin.Common.Util.UI;
using PdmSwPlugin.Common.Setting;
using PdmSwPlugin.PDM.Model;
using System.Diagnostics;
using PdmSwPlugin.PDM.Constant;
using static PdmSwPlugin.PDM.Event.PdmEvent;
using PdmSwPlugin.PDM.Model;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Interop;
using PdmSwPlugin.Commmon.Control;
using PdmSwPlugin.Common.Entity.System;
using System.Windows.Documents;
using System.Windows.Input;
using NPOI.POIFS.Properties;
using NPOI.POIFS.Crypt;
using System.Threading.Tasks.Schedulers;
using static PdmSwPlugin.PDM.Event.PdmEvent;
namespace PdmSwPlugin.PDM
{
@@ -169,6 +164,15 @@
            }
        }
        public void AutoSaveAlert(List<string> msgs)
        {
            //Dispatcher.Invoke(() =>
            //{
            //    MultiExWindow exWin = new MultiExWindow(this, "以下文档因删除特定配置而被保存", msgs, "文件路径");
            //    ShowExWindow(exWin);
            //});
        }
        /// <summary>
        /// 刷新按钮
        /// </summary>
@@ -187,6 +191,11 @@
                await Task.Run(() =>
                {
                    RefreshBomList(SwApp.IActiveDoc2);
                    if (model.bomTreeReader.needSaveList.Count > 0)
                    {
                        List<string> msgs = new List<string>(model.bomTreeReader.needSaveList);
                        AutoSaveAlert(msgs);
                    }
                });
                Logger.Debug("PDM插件,列表刷新完成!");
            }
@@ -1004,8 +1013,13 @@
            allProperties["历史图纸"] = drawInfo.HistoryData.ToString();
            string drawFilePath = filepath.Replace(Path.GetExtension(filepath), ".slddrw");
            bool drawExists = File.Exists(drawFilePath);
            // 工程图一致性检查
            // 工程图一致性检查
            allProperties["工程图是否存在"] = drawExists.ToString();
            // 不跳过检查的加工件,如果工程图不存在,设置noDrw为true
            if (!drawExists && !bom.skipCheck && bom.produceWay == "加工件")
            {
                drawInfo.noDrw = true;
            }
            allProperties["md5"] = bom.localD3Md5;
            if (bom.lost || bom.BomInfo.isHidden || sldDoc == null)
            {
@@ -1107,11 +1121,10 @@
                    if (!bom.skipCheck)
                    {
                        result[filepath] = GetSingleDrawInfo(bom);
                        if (bom.BomInfo.inKeeDeeDb == true) result[filepath]._inKeeDeeDb = true;
                    }
                }
                ObservableCollection<PdmBom> children = bom.modules;
                if (children != null)
@@ -1186,7 +1199,7 @@
            bool allSuccess = true;
            Dictionary<string, DrawInfo> properties = GetAllPropertiesByTask(temp);
            MaskAdorner.ShowMessage(content, "正在请求数据...");
           // var factory = LimitedConcurrencyLevelTaskScheduler.Factory;
            // var factory = LimitedConcurrencyLevelTaskScheduler.Factory;
            CountdownEvent counter = new CountdownEvent(properties.Count);
            int iii = 0;
            foreach (KeyValuePair<string, DrawInfo> property in properties)
@@ -1199,24 +1212,29 @@
                    try
                    {
                        Logger.Error($"{key} checking rule...");
                        DrawInfo checkResult;
                        Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
                        DrawInfo checkResult = result.HandleResult();
                        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))
                        if (property.Value.noDrw || property.Value.isHidden || (!properties[key].HistoryData && (!checkResult.checkRuleOk)))
                        {
                            allSuccess = false;
                        }
                        if (!properties[key].HistoryData)
                        lock (temp)
                        {
                            lock (temp)
                            if (property.Value.isHidden)
                            {
                                if (property.Value.isHidden)
                                {
                                    temp.Add($"物料【{key}】被设置为隐藏!");
                                }
                                temp.Add($"物料【{key}】被设置为隐藏!");
                            }
                            if (property.Value.noDrw && property.Value.HistoryData)
                            {
                                temp.Add($"物料【{key}】未找到工程图!");
                            }
                            if (!properties[key].HistoryData)
                            {
                                if (msgs != null && msgs.Count > 0)
                                {
                                    foreach (string msg in msgs)
@@ -1419,6 +1437,12 @@
                try
                {
                    RefreshBomList(SwApp.IActiveDoc2);
                    if (model.bomTreeReader.needSaveList.Count > 0)
                    {
                        List<string> infos = new List<string>(model.bomTreeReader.needSaveList);
                        AutoSaveAlert(infos);
                    }
                    if (!DoCheckRuleAsync(out List<string> msgs))
                    {
                        Dispatcher.Invoke(() =>
@@ -1468,7 +1492,7 @@
                try
                {
                    // 对所有的BOM做规则检查
                    bool allSuccess = DoCheckRule(out _);
                    bool allSuccess = DoCheckRuleAsync(out _);
                    // 先获取所有的BOM
                    HashSet<string> cache = new HashSet<string>();
                    // 然后筛选选中的BOM
@@ -1497,12 +1521,20 @@
                    if (!allSuccess)
                    {
                        // 如果有未通过的图纸,需要提示
                        var err = boms.Where(b => !b.IsHistoryData && !b.checkRuleOk).ToList();
                        var err = boms.Where(b => b.noDrw || b.isHidden || (!b.IsHistoryData && (!b.checkRuleOk))).ToList();
                        if (err != null && err.Count > 0)
                        {
                            List<string> msgs = new List<string>();
                            foreach (var ee in err)
                            {
                                if (ee.noDrw && ee.IsHistoryData)
                                {
                                    msgs.Add($"物料【{ee.partNo}】未通过规则检查!未找到工程图");
                                }
                                if (ee.drawInfo.isHidden)
                                {
                                    msgs.Add($"物料【{ee.partNo}】未通过规则检查!被设为隐藏");
                                }
                                if (ee.drawInfo.errMessages == null)
                                {
                                    msgs.Add($"物料【{ee.partNo}】未通过规则检查!");
@@ -1524,6 +1556,10 @@
                    }
                    // 都通过了,再进行审批
                    // 筛选非特殊的审核
                    boms = boms.Where(b => !b._drawInfo.isSpecial).ToList();
                    if (boms == null || boms.Count <= 0) return;
                    // 先申请单号
                    DrawAuditOrder daOrder = new DrawAuditOrder
@@ -1760,50 +1796,69 @@
        /// <param name="e"></param>
        private void TextBox_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            // 检查是否是双击
            if (e.ClickCount == 2)
            try
            {
                TextBlock textBlock = sender as TextBlock;
                PdmBom bom = textBlock.DataContext as PdmBom;
                if (bom.checkRuleResult == 0)
                // 检查是否是双击
                if (e.ClickCount == 2)
                {
                    this.Warning("该图纸还未检查");
                    return;
                }
                if (bom.checkRuleResult == 3)
                {
                    string title = string.Empty;
                    if (bom.IsHistoryData)
                    TextBlock textBlock = sender as TextBlock;
                    PdmBom bom = textBlock.DataContext as PdmBom;
                    if (bom.checkRuleResult == 0)
                    {
                        title = "历史图纸无需检查";
                        this.Warning("该图纸还未检查");
                        return;
                    }
                    else if (bom.ExcludeFromBOM)
                    {
                        title = "不在物料明细表中的物料无需检查";
                    }
                    else if (bom.component?.IsVirtual == true)
                    {
                        title = "虚拟件无需检查";
                    }
                    this.Info(title);
                    return;
                }
                if (bom.checkRuleOk && !bom.isHidden)
                {
                    this.Show("规则检查通过");
                }
                else
                {
                    List<string> errs = new List<string>();
                    if (bom.noDrw && bom.IsHistoryData)
                    {
                        errs.Add("工程图不存在 ");
                    }
                    if (bom.isHidden)
                    {
                        errs.Add("文档被设置为隐藏");
                    }
                    errs.AddRange(bom.drawInfo.errMessages);
                    MultiExWindow exWin = new MultiExWindow(this, "检查结果", errs);
                    exWin.ShowDialog();
                    if (bom.drawInfo.errMessages != null)
                    {
                        errs.AddRange(bom.drawInfo.errMessages);
                    }
                    if (errs.Count > 0)
                    {
                        MultiExWindow exWin = new MultiExWindow(this, "检查结果", errs);
                        exWin.ShowDialog();
                    }
                    else if (bom.checkRuleResult == 3)
                    {
                        string title = string.Empty;
                        if (bom.IsHistoryData)
                        {
                            title = "历史图纸无需检查";
                        }
                        else if (bom.ExcludeFromBOM)
                        {
                            title = "不在物料明细表中的物料无需检查";
                        }
                        else if (bom.component?.IsVirtual == true)
                        {
                            title = "虚拟件无需检查";
                        }
                        else
                        {
                            title = "无需检查";
                        }
                        this.Info(title);
                        return;
                    }
                    else if (bom.checkRuleOk && !bom.isHidden)
                    {
                        this.Show("规则检查通过");
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Double Click CheckRule Exception.", ex);
                this.Error($"未知异常:{ex.Message}");
            }
        }
@@ -1814,59 +1869,77 @@
        /// <param name="e"></param>
        private void AuditTextBox_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            // 检查是否是双击
            if (e.ClickCount == 2)
            try
            {
                TextBlock textBlock = sender as TextBlock;
                PdmBom bom = textBlock.DataContext as PdmBom;
                if (string.IsNullOrEmpty(bom.BomInfo.status))
                // 检查是否是双击
                if (e.ClickCount == 2)
                {
                    if (bom.produceWay == "模组" || bom.produceWay == "标准件")
                    TextBlock textBlock = sender as TextBlock;
                    PdmBom bom = textBlock.DataContext as PdmBom;
                    if (bom._drawInfo.isSpecial)
                    {
                        this.Info($"{bom.produceWay}无需审核");
                        this.Info("无需审核");
                        return;
                    }
                    if (bom.IsHistoryData && !bom.localDocChanged)
                    if (bom.BomInfo.inKeeDeeDb == true)
                    {
                        this.Info("历史图纸无需审核");
                        this.Info("已入系统");
                        return;
                    }
                    if (bom.IsHistoryData && bom.localDocChanged)
                    if (string.IsNullOrEmpty(bom.BomInfo.status))
                    {
                        this.Info("历史图纸一致性变更,需审核");
                        return;
                    }
                    this.Warning("该图纸未审核");
                    return;
                }
                MaskAdorner.ShowMask(content, "请求中,请稍后...");
                Task.Run(() =>
                {
                    try
                    {
                        Result<List<DrawAuditHis>> res = Client.GetSyncAction<List<DrawAuditHis>>("drawAudit/listTaskHis", new DrawAudit
                        if (bom.produceWay == "模组" || bom.produceWay == "标准件")
                        {
                            id = bom.BomInfo.id
                        });
                        var datas = res.HandleResult();
                        Dispatcher.Invoke(() =>
                            this.Info($"{bom.produceWay}无需审核");
                            return;
                        }
                        if (bom.IsHistoryData && !bom.localDocChanged)
                        {
                            //DrawAuditHisWindow window = new DrawAuditHisWindow(this, $"【{bom.partModel}】审核详情", datas);
                            RichHisWindow window = new RichHisWindow(this, $"【{bom.partModel}】审核详情", datas);
                            this.Info("历史图纸无需审核");
                            return;
                        }
                        if (bom.IsHistoryData && bom.localDocChanged)
                        {
                            this.Info("历史图纸一致性变更,需审核");
                            return;
                        }
                        this.Warning("该图纸未审核");
                        return;
                    }
                    MaskAdorner.ShowMask(content, "请求中,请稍后...");
                    Task.Run(() =>
                    {
                        try
                        {
                            Result<List<DrawAuditHis>> res = Client.GetSyncAction<List<DrawAuditHis>>("drawAudit/listTaskHis", new DrawAudit
                            {
                                id = bom.BomInfo.id
                            });
                            var datas = res.HandleResult();
                            Dispatcher.Invoke(() =>
                            {
                                //DrawAuditHisWindow window = new DrawAuditHisWindow(this, $"【{bom.partModel}】审核详情", datas);
                                RichHisWindow window = new RichHisWindow(this, $"【{bom.partModel}】审核详情", datas);
                            window.ShowDialog();
                        });
                    }
                    catch (Exception ex)
                    {
                        Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, Get draw audit history failed.", ex);
                        this.Error($"V{PdmUser.LoginUser.pluginVersion},获取审核历史失败!{ex.Message}");
                    }
                    finally
                    {
                        MaskAdorner.HideMask(content);
                    }
                });
                                window.ShowDialog();
                            });
                        }
                        catch (Exception ex)
                        {
                            Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, Get draw audit history failed.", ex);
                            this.Error($"V{PdmUser.LoginUser.pluginVersion},获取审核历史失败!{ex.Message}");
                        }
                        finally
                        {
                            MaskAdorner.HideMask(content);
                        }
                    });
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Double Click Audit Status Exception.", ex);
                this.Error($"未知异常:{ex.Message}");
            }
        }
@@ -1997,6 +2070,12 @@
                        {
                            throw new CantCheckInException(new List<string> { "请打开一张图纸" });
                        }
                        if (model.bomTreeReader.needSaveList.Count > 0)
                        {
                            List<string> infos = new List<string>(model.bomTreeReader.needSaveList);
                            AutoSaveAlert(infos);
                        }
                        DoCheckRuleAsync(out _);
                        // 筛选所有在物料明细表中,不跳过检查并且检查未通过的,类型是加工件的未通过审核的,加工件审核通过的但图纸变更的
                        List<string> errs = model.bomTreeReader.CacheList.Select(b => b.NeedStopCheckIn())
PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs
@@ -234,26 +234,33 @@
        public void InitPropertyData()
        {
            if (Client == null)
            try
            {
                Client = clientCreator.GetClient();
                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);
            }
            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);
            catch (Exception ex)
            {
                Logger.Error($"PropertySetting Init Error!", ex);
            }
        }
        private void Jgj_SinglePropertyChanged(object sender, string name, object value)
@@ -285,6 +292,8 @@
        private void UpdateActiveDoc()
        {
            long start = DateTime.Now.Millisecond;
            Logger.Debug("UpdateActiveDoc Start...");
            if (activeDoc != null)
            {
                DetachDocNotify(activeDoc);
@@ -300,7 +309,11 @@
                    activeDoc.ClearSelection2(true);
                }
            }
            Logger.Debug($"UpdateActiveDoc End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
            start = DateTime.Now.Millisecond;
            Logger.Debug("UpdateUI Start...");
            UpdateUI(activeDoc);
            Logger.Debug($"UpdateUI End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
        }
        /// <summary>
@@ -382,9 +395,10 @@
            ReadDoc = doc;
            Dispatcher.Invoke(() =>
            {
                SwitchVisiable();
                // LoadDocProperties();
            });
            SwitchVisiable();
        }
        private int Ass_UserSelectionPostNotify()
@@ -419,6 +433,9 @@
        /// </summary>
        private void SwitchVisiable()
        {
            var start = DateTime.Now.Millisecond;
            Logger.Debug("SwitchVisiable Start...");
            HashSet<string> skipName = new HashSet<string> {
                NameConstant.materialCode
            };
@@ -522,9 +539,15 @@
                last = null;
            }
            ActiveOpter = control;
            contentPanel.Children.Clear();
            newOne.UpdateProperty += Jgj_SinglePropertyChanged;
            contentPanel.Children.Add(control);
            Dispatcher.Invoke(() =>
            {
                contentPanel.Children.Clear();
                contentPanel.Children.Add(control);
            });
            Logger.Debug($"SwitchVisiable End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
        }
        /// <summary>
@@ -694,11 +717,19 @@
        private void SaveButton_Click(object sender, RoutedEventArgs e)
        {
            if (ReadDoc == null)
            try
            {
                return;
                if (ReadDoc == null)
                {
                    return;
                }
                SaveDoc(false);
            }
            SaveDoc(false);
            catch (Exception ex)
            {
                Logger.Error($"Property Setting Save Doc Error!", ex);
                this.Error($"保存失败!{ex.Message}");
            }
        }
        public void RefreshData()
@@ -773,12 +804,20 @@
        public void OnCustomPropertyChange(string propName, string Configuration, string oldValue, string NewValue, int valueType)
        {
            if (oldValue == NewValue)
            try
            {
                return;
                if (oldValue == NewValue)
                {
                    return;
                }
                IPropertyOpt opt = ActiveOpter as IPropertyOpt;
                opt.UpdateSingleProperty(propName, NewValue);
            }
            IPropertyOpt opt = ActiveOpter as IPropertyOpt;
            opt.UpdateSingleProperty(propName, NewValue);
            catch (Exception ex)
            {
                Logger.Error("Property Setting OnCustomPropertyChange Error!", ex);
                this.Error($"属性变更异常!{ex.Message}");
            }
        }
        public void OnDocDestroy(ModelDoc2 doc)
@@ -796,6 +835,8 @@
        /// </summary>
        public void AlertSaveWindow()
        {
            var start = DateTime.Now.Millisecond;
            Logger.Debug("AlertSaveWindow Start...");
            IPropertyOpt opt = ActiveOpter as IPropertyOpt;
            if (opt != null && opt.GetDocChanged())
            {
@@ -818,29 +859,38 @@
                    opt.ResetProperty(out string errMsg);
                }
            }
            Logger.Debug($"AlertSaveWindow End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
        }
        public void OnTabControlSelectionChange(object sender, SelectionChangedEventArgs e)
        {
            if (e.RemovedItems == null)
            try
            {
                return;
            }
            foreach (object obj in e.RemovedItems)
            {
                if (obj is TabItem item)
                {
                    if (item.Content == this)
                    {
                        AlertSaveWindow();
                        break;
                    }
                }
                else
                if (e.RemovedItems == null)
                {
                    return;
                }
                foreach (object obj in e.RemovedItems)
                {
                    if (obj is TabItem item)
                    {
                        if (item.Content == this)
                        {
                            AlertSaveWindow();
                            break;
                        }
                    }
                    else
                    {
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error($"Property Setting OnTabControlSelectionChange Error!", ex);
                this.Error($"{ex.Message}");
            }
        }
    }