chr
2025-03-04 3f62d18e4361cd1d7a49c126765d95b2ad9c8246
优化插件;
2个文件已添加
35个文件已修改
1575 ■■■■ 已修改文件
.vs/SwPlugin/v17/DocumentLayout.backup.json 310 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/SwPlugin/v17/DocumentLayout.json 321 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
InnoSetupScript/PdmSwPlugin.iss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSw/log4net.config 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Interface/IActiveDocChangeHandler.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Style/ComboxStyle.xaml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Util/CustomPropertyUtil.cs 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Util/SwDMUtil.cs 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Util/UI/MultiExWindow.xaml.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.DrawApprove/DrawApprove.xaml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.DrawApprove/DrawAuditHisControl.xaml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/Constant/PluginConst.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/MainControl.xaml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/MainControl.xaml.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/MainTab.xaml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/SwAddIn/MainControl.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.MaterialSelect/SwAddIn/MaterialSelectControl.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PDM/PdmControl.xaml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PDM/PdmControl.xaml.cs 176 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/CommonSettingControl.xaml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Panel/DefaultPanel.xaml.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Panel/JgjModulePanel.xaml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Panel/JgjModulePanel.xaml.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Panel/JgjPartPanel.xaml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Panel/JgjPartPanel.xaml.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Panel/StandardModulePanel.xaml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Panel/StandardModulePanel.xaml.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Panel/StandardPartPanel.xaml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Panel/StandardPartPanel.xaml.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/PdmSwPlugin.PropertySetting.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/PropertySettingControl.xaml.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/SettingControl.xaml.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Util/PropHolder.cs 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/Util/PropSetter.cs 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/SwPlugin/v17/DocumentLayout.backup.json
@@ -3,16 +3,80 @@
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\",
  "Documents": [
    {
      "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}",
      "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:{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:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\util\\swdmutil.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\util\\swdmutil.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmsw\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
      "RelativeMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|solutionrelative:pdmsw\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.main\\maintab.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\maintab.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.drawapprove\\drawaudithiscontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|solutionrelative:pdmswplugin.drawapprove\\drawaudithiscontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.drawapprove\\drawapprove.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|solutionrelative:pdmswplugin.drawapprove\\drawapprove.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.propertysetting\\commonsettingcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\commonsettingcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.main\\maincontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\maincontrol.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\\style\\linkbutton.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\style\\linkbutton.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "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:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|D:\\Workspace\\PdmSwPlugin2\\wpfui\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
      "RelativeMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|solutionrelative:wpfui\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|D:\\Workspace\\PdmSwPlugin2\\wpfui\\properties\\assemblyinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|solutionrelative:wpfui\\properties\\assemblyinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{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:{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:{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:{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}"
      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\util\\ui\\multiexwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\util\\ui\\multiexwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -22,44 +86,234 @@
      "DocumentGroups": [
        {
          "DockedHeight": 530,
          "SelectedChildIndex": 1,
          "SelectedChildIndex": 19,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "PluginConst.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "RelativeToolTip": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-10T03:06:44.394Z",
              "EditorCaption": ""
            },
            {
              "$type": "Bookmark",
              "Name": "ST:0:0:{269a02dc-6af8-11d3-bdc4-00c04f688e50}"
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "SwDMUtil.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\SwDMUtil.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Util\\SwDMUtil.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\SwDMUtil.cs",
              "RelativeToolTip": "PdmSwPlugin.Common\\Util\\SwDMUtil.cs",
              "ViewState": "AgIAAEsAAAAAAAAAAAAywFcAAAAfAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-19T08:17:18.883Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "DrawAuditHisControl.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawAuditHisControl.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.DrawApprove\\DrawAuditHisControl.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawAuditHisControl.xaml",
              "RelativeToolTip": "PdmSwPlugin.DrawApprove\\DrawAuditHisControl.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-19T01:34:25.024Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "MainTab.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainTab.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\MainTab.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainTab.xaml",
              "RelativeToolTip": "PdmSwPlugin.Main\\MainTab.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-19T01:25:43.752Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 9,
              "Title": "MainControl.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\MainControl.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml",
              "RelativeToolTip": "PdmSwPlugin.Main\\MainControl.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-19T01:24:39.136Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "CommonSettingControl.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml",
              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-19T01:24:14.453Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 10,
              "Title": "LinkButton.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Style\\LinkButton.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Style\\LinkButton.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Style\\LinkButton.xaml",
              "RelativeToolTip": "PdmSwPlugin.Common\\Style\\LinkButton.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-18T02:04:24.459Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "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": "2025-02-14T08:10:21.941Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "log4net.config",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\log4net.config",
              "RelativeDocumentMoniker": "PdmSw\\log4net.config",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\log4net.config",
              "RelativeToolTip": "PdmSw\\log4net.config",
              "ViewState": "AgIAAA8AAAAAAAAAAADwvyMAAAAkAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000601|",
              "WhenOpened": "2025-02-14T06:58:08.237Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 13,
              "Title": "AssemblyInfo.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\Properties\\AssemblyInfo.cs",
              "RelativeDocumentMoniker": "WpfUI\\Properties\\AssemblyInfo.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\Properties\\AssemblyInfo.cs",
              "RelativeToolTip": "WpfUI\\Properties\\AssemblyInfo.cs",
              "ViewState": "AgIAACQAAAAAAAAAAADwvzYAAAAvAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-14T06:24:49.631Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 11,
              "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": "AgIAADQAAAAAAAAAAAAYwBEAAAAdAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-14T06:24:33.175Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 12,
              "Title": "log4net.config",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\log4net.config",
              "RelativeDocumentMoniker": "WpfUI\\log4net.config",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\log4net.config",
              "RelativeToolTip": "WpfUI\\log4net.config",
              "ViewState": "AgIAAAMAAAAAAAAAAAAUwBAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000601|",
              "WhenOpened": "2025-02-14T06:23:24.263Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 14,
              "Title": "MainControl.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "RelativeToolTip": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "ViewState": "AgIAACoAAAAAAAAAAAAzwDgAAAAgAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-12T08:10:40.337Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 15,
              "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": "AgIAACoBAAAAAAAAAAAawEcBAAAiAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-12T08:00:05.533Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 16,
              "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": "AgIAALsAAAAAAAAAAAAswMcAAAAVAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-12T07:44:36.406Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "DrawApprove.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "RelativeToolTip": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-12T01:37:15.351Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 18,
              "Title": "MultiExWindow.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\UI\\MultiExWindow.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Util\\UI\\MultiExWindow.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\UI\\MultiExWindow.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.Common\\Util\\UI\\MultiExWindow.xaml.cs",
              "ViewState": "AgIAAEUAAAAAAAAAAAA0wFwAAAA+AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-10T02:13:56.89Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 17,
              "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==",
              "ViewState": "AgIAAPEBAAAAAAAAAAAYwAMCAABHAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-01-02T06:15:07.965Z",
              "EditorCaption": ""
              "WhenOpened": "2025-02-10T00:46:05.182Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "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==",
              "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": "AgIAAJwGAAAAAAAAAIBBwKwGAAAgAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-01-02T06:10:11.494Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "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",
              "WhenOpened": "2025-01-24T08:15:20.974Z",
              "EditorCaption": ""
            }
          ]
.vs/SwPlugin/v17/DocumentLayout.json
@@ -3,16 +3,80 @@
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\",
  "Documents": [
    {
      "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:{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:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\commonsettingcontrol.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:{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:{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:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\util\\swdmutil.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\util\\swdmutil.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmsw\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
      "RelativeMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|solutionrelative:pdmsw\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.main\\maintab.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\maintab.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.drawapprove\\drawaudithiscontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|solutionrelative:pdmswplugin.drawapprove\\drawaudithiscontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.drawapprove\\drawapprove.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|solutionrelative:pdmswplugin.drawapprove\\drawapprove.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.propertysetting\\commonsettingcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\commonsettingcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.main\\maincontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\maincontrol.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\\style\\linkbutton.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\style\\linkbutton.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|D:\\Workspace\\PdmSwPlugin2\\wpfui\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
      "RelativeMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|solutionrelative:wpfui\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|D:\\Workspace\\PdmSwPlugin2\\wpfui\\properties\\assemblyinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|solutionrelative:wpfui\\properties\\assemblyinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{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:{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:{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:{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}"
      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\util\\ui\\multiexwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\util\\ui\\multiexwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -22,45 +86,234 @@
      "DocumentGroups": [
        {
          "DockedHeight": 530,
          "SelectedChildIndex": 1,
          "SelectedChildIndex": 12,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "PluginConst.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "RelativeToolTip": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-10T03:06:44.394Z"
            },
            {
              "$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": "AgIAAJ0GAAAAAAAAAAAkwKwGAAAgAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-01-24T08:15:20.974Z",
              "EditorCaption": ""
            },
            {
              "$type": "Bookmark",
              "Name": "ST:0:0:{269a02dc-6af8-11d3-bdc4-00c04f688e50}"
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "SwDMUtil.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\SwDMUtil.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Util\\SwDMUtil.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\SwDMUtil.cs",
              "RelativeToolTip": "PdmSwPlugin.Common\\Util\\SwDMUtil.cs",
              "ViewState": "AgIAAEsAAAAAAAAAAAAywFcAAAAfAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-19T08:17:18.883Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "DrawAuditHisControl.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawAuditHisControl.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.DrawApprove\\DrawAuditHisControl.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawAuditHisControl.xaml",
              "RelativeToolTip": "PdmSwPlugin.DrawApprove\\DrawAuditHisControl.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-19T01:34:25.024Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "MainTab.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainTab.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\MainTab.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainTab.xaml",
              "RelativeToolTip": "PdmSwPlugin.Main\\MainTab.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-19T01:25:43.752Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 10,
              "Title": "MainControl.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\MainControl.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml",
              "RelativeToolTip": "PdmSwPlugin.Main\\MainControl.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-19T01:24:39.136Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 9,
              "Title": "CommonSettingControl.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml",
              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-19T01:24:14.453Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 11,
              "Title": "LinkButton.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Style\\LinkButton.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Style\\LinkButton.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Style\\LinkButton.xaml",
              "RelativeToolTip": "PdmSwPlugin.Common\\Style\\LinkButton.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-18T02:04:24.459Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "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": "2025-02-14T08:10:21.941Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "log4net.config",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\log4net.config",
              "RelativeDocumentMoniker": "PdmSw\\log4net.config",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\log4net.config",
              "RelativeToolTip": "PdmSw\\log4net.config",
              "ViewState": "AgIAAA8AAAAAAAAAAADwvyMAAAAkAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000601|",
              "WhenOpened": "2025-02-14T06:58:08.237Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 13,
              "Title": "AssemblyInfo.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\Properties\\AssemblyInfo.cs",
              "RelativeDocumentMoniker": "WpfUI\\Properties\\AssemblyInfo.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\Properties\\AssemblyInfo.cs",
              "RelativeToolTip": "WpfUI\\Properties\\AssemblyInfo.cs",
              "ViewState": "AgIAACQAAAAAAAAAAADwvzYAAAAvAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-14T06:24:49.631Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "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": "AgIAABsAAAAAAAAAAAAAADMAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-14T06:24:33.175Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 12,
              "Title": "log4net.config",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\log4net.config",
              "RelativeDocumentMoniker": "WpfUI\\log4net.config",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\log4net.config",
              "RelativeToolTip": "WpfUI\\log4net.config",
              "ViewState": "AgIAAAMAAAAAAAAAAAAUwBAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000601|",
              "WhenOpened": "2025-02-14T06:23:24.263Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 14,
              "Title": "MainControl.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "RelativeToolTip": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "ViewState": "AgIAACoAAAAAAAAAAAAzwDgAAAAgAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-12T08:10:40.337Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 15,
              "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": "AgIAACoBAAAAAAAAAAAawEcBAAAiAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-12T08:00:05.533Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 16,
              "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": "AgIAALsAAAAAAAAAAAAswMcAAAAVAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-12T07:44:36.406Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "DrawApprove.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "RelativeToolTip": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2025-02-12T01:37:15.351Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 18,
              "Title": "MultiExWindow.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\UI\\MultiExWindow.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Util\\UI\\MultiExWindow.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\UI\\MultiExWindow.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.Common\\Util\\UI\\MultiExWindow.xaml.cs",
              "ViewState": "AgIAAEUAAAAAAAAAAAA0wFwAAAA+AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-02-10T02:13:56.89Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 17,
              "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==",
              "ViewState": "AgIAAPEBAAAAAAAAAAAYwAMCAABHAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-01-02T06:15:07.965Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "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": "2025-01-02T06:10:11.494Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "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": ""
              "WhenOpened": "2025-02-10T00:46:05.182Z"
            }
          ]
        }
InnoSetupScript/PdmSwPlugin.iss
@@ -7,7 +7,7 @@
; 自动更新程序路径
#define AutoUpdaterDir = "D:\Workspace\PdmSwPlugin2\PdmSw\bin\x64\Release\AutoUpdater\"
; 版本
#define Version = "_0.0.0.45_审核质量"
#define Version = "_0.0.0.46_工程图引用问题"
; 生成的Installer存放路径
#define OutPutDir = "Z:\Output"
PdmSw/log4net.config
@@ -31,7 +31,7 @@
    </appender>
    <root>
        <level value="INFO" />
        <level value="DEBUG" />
        <appender-ref ref="Console" />
        <appender-ref ref="RollingFile" />
    </root>
PdmSwPlugin.Common/Interface/IActiveDocChangeHandler.cs
@@ -32,5 +32,7 @@
        void OnDocDestroy(ModelDoc2 doc);
        void AfterDocDestroy();
        void DisabledHandler();
    }
}
PdmSwPlugin.Common/Style/ComboxStyle.xaml
@@ -9,6 +9,7 @@
                    <Grid>
                        <!-- 下拉按钮 -->
                        <ToggleButton x:Name="ToggleButton" Grid.Column="2" Focusable="false" ClickMode="Press"
                                      FontSize="16"
                                   HorizontalContentAlignment="Stretch"
                                   IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
                            <Grid>
PdmSwPlugin.Common/Util/CustomPropertyUtil.cs
@@ -1,5 +1,6 @@
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System;
using System.Collections.Generic;
namespace PdmSwPlugin.Common.Util
@@ -31,53 +32,6 @@
            }
        }
        /// <summary>
        /// 获取文档属性
        /// </summary>
        /// <param name="currentModelDoc">文档</param>
        /// <param name="needResolve">是否转换值</param>
        /// <param name="skipName">跳过的name</param>
        /// <returns></returns>
        public static Dictionary<string, string> GetCustomProperties2(ModelDoc2 currentModelDoc,
            bool needResolve,
            HashSet<string> skipName = null)
        {
            CustomPropertyManager customPropertyManager = GetCustomPropertyManager(currentModelDoc);
            if (customPropertyManager == null)
            {
                return null;
            }
            Dictionary<string, string> Properties = new Dictionary<string, string>();
            string[] names = customPropertyManager.GetNames();
            if (names == null)
            {
                return Properties;
            }
            foreach (string name in names)
            {
                if (customPropertyManager.Get6(name, false, out string valueOut, out string resolvedValueOut, out _, out _)
                    != (int)swCustomInfoGetResult_e.swCustomInfoGetResult_NotPresent)
                {
                    string value = (needResolve && (skipName == null || !skipName.Contains(name))) ? resolvedValueOut : valueOut;
                    Properties[name] = value;
                }
            }
            return Properties;
        }
        public static bool SaveDoc(ModelDoc2 doc, Dictionary<string, string> props, ref int err, ref int warn)
        {
            SetCustomProperties(doc, props);
            if (doc.Save3((int)swSaveAsOptions_e.swSaveAsOptions_AvoidRebuildOnSave,
                    ref err, ref warn))
            {
                return true;
            }
            return false;
        }
        public static Dictionary<string, string> GetCustomProperties(ModelDoc2 currentModelDoc,
            bool needResolve,
            HashSet<string> skipValue = null)
@@ -106,6 +60,53 @@
            return Properties;
        }
        /// <summary>
        /// 获取文档属性
        /// </summary>
        /// <param name="currentModelDoc">文档</param>
        /// <param name="needResolve">是否转换值</param>
        /// <param name="skipName">跳过的name</param>
        /// <returns></returns>
        public static Dictionary<string, string> GetCustomProperties2(ModelDoc2 currentModelDoc,
            bool needResolve,
            HashSet<string> skipName,
            HashSet<string> skipResolveName)
        {
            CustomPropertyManager customPropertyManager = GetCustomPropertyManager(currentModelDoc);
            if (customPropertyManager == null)
            {
                return null;
            }
            Dictionary<string, string> Properties = new Dictionary<string, string>();
            string[] names = customPropertyManager.GetNames();
            if (names == null)
            {
                return Properties;
            }
            foreach (string name in names)
            {
                if (skipName != null && skipName.Contains(name)) continue;
                if (customPropertyManager.Get6(name, false, out string valueOut, out string resolvedValueOut, out _, out _)
                    != (int)swCustomInfoGetResult_e.swCustomInfoGetResult_NotPresent)
                {
                    string value = (needResolve && (skipResolveName == null || !skipResolveName.Contains(name))) ? resolvedValueOut : valueOut;
                    Properties[name] = value;
                }
            }
            return Properties;
        }
        public static bool SaveDoc(ModelDoc2 doc, Dictionary<string, string> props, ref int err, ref int warn)
        {
            SetCustomProperties(doc, props);
            if (doc.Save3((int)swSaveAsOptions_e.swSaveAsOptions_AvoidRebuildOnSave,
                    ref err, ref warn))
            {
                return true;
            }
            return false;
        }
        public static string GetCustomValue(this Dictionary<string, string> datas, string name, bool ignoreCase = false)
        {
@@ -181,6 +182,17 @@
            return values[5].ToString();
        }
        public static string GetMassBySWDM(ModelDoc2 doc)
        {
            if (doc == null) return null;
            double[] values = SwDMUtil.GetMassProperty(doc.GetPathName(), out string errMSg);
            if (values == null)
            {
                return null;
            }
            return values[5].ToString();
        }
        public static bool SetCustomProperties(ModelDoc2 doc, string key, string value)
        {
            CustomPropertyManager cpm = doc.Extension.CustomPropertyManager[""];
PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs
@@ -272,7 +272,7 @@
                id = Guid.NewGuid().ToString(),
                doc = doc,
                drawingType = drawingType,
                properties = CustomPropertyUtil.GetCustomProperties(doc, true),
                properties = CustomPropertyUtil.GetCustomProperties2(doc, true, null, null),
                d3FilePath = childPath,
            };
            return bomInfo;
PdmSwPlugin.Common/Util/SwDMUtil.cs
@@ -1,5 +1,6 @@
using SolidWorks.Interop.swdocumentmgr;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace PdmSwPlugin.Common.Util
@@ -7,7 +8,7 @@
    public class SwDMUtil
    {
        /// <summary>
        /// 凌创公司的 DM API 授权码
        /// 公司的 DM API 授权码
        /// </summary>
        public static string LinktronLicenseKey = @"SuzhouLinktronSystemsCoLtd:swdocmgr_general-11785-02051-00064-33793-08629-34307-00007-05128-58478-32321-57480-30765-00622-59999-16385-62752-47753-50558-31076-40652-29868-22926-54604-41449-54717-42289-44473-51665-47549-58701-53709-46485-03533-12733-37329-14337-29280-51290-50890-25690-25696-964";
@@ -76,6 +77,72 @@
            }
        }
        /// <summary>
        /// 获取一张工程图引用的3D图路径
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="error1"></param>
        /// <param name="error2"></param>
        /// <returns></returns>
        public static string[] GetDrawingRef2(string filePath, out string errMsg, out int[] status)
        {
            errMsg = null;
            status = null;
            try
            {
                string originalExt;
                SwDmDocumentType docType = DMSldFileExtentionChecker.CheckDM(filePath, out originalExt);
                if (docType != SwDmDocumentType.swDmDocumentDrawing)
                {
                    errMsg = "给定的文档不是一张工程图";
                    throw null;
                }
                SwDMClassFactory swDMClassFactory = new SwDMClassFactory();
                SwDMApplication swDMApp = swDMClassFactory.GetApplication(LinktronLicenseKey);
                if (swDMApp == null)
                {
                    Marshal.ReleaseComObject(swDMClassFactory);
                    errMsg = "SwDM 初始化失败";
                    return null;
                }
                SwDMDocument23 swDoc = (SwDMDocument23)swDMApp.GetDocument(filePath, docType, true, out var error1);
                if (swDoc == null)
                {
                    Marshal.ReleaseComObject(swDMApp);
                    Marshal.ReleaseComObject(swDMClassFactory);
                    errMsg = $"SwDM 加载文档失败,异常【{error1}】";
                    return null;
                }
                var swSearchOpt = swDMApp.GetSearchOptionObject();
                object vBrokenRefs = null;
                object vIsVirtuals = null;
                object vTimeStamps = null;
                object vIsImported = null;
                string[] views = (string[])swDoc.GetAllExternalReferences5(swSearchOpt,
                    out vBrokenRefs, out vIsVirtuals, out vTimeStamps, out vIsImported);
                if (views == null || views.Length <= 0)
                {
                    Marshal.ReleaseComObject(swDoc);
                    Marshal.ReleaseComObject(swDMApp);
                    Marshal.ReleaseComObject(swDMClassFactory);
                    errMsg = $"选定的工程图不包含有效的视图";
                    return null;
                }
                Marshal.ReleaseComObject(swDoc);
                Marshal.ReleaseComObject(swDMApp);
                Marshal.ReleaseComObject(swDMClassFactory);
                status = (int[])vBrokenRefs;
                return views;
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
                return null;
            }
        }
        public static double[] GetMassProperty(string filePath, out string errMsg)
        {
            try
@@ -140,5 +207,70 @@
                return null;
            }
        }
        public static Dictionary<string, string> GetProperty(string filePath, out string errMsg)
        {
            try
            {
                errMsg = null;
                string originalExt;
                SwDmDocumentType docType = DMSldFileExtentionChecker.CheckDM(filePath, out originalExt);
                if (docType == SwDmDocumentType.swDmDocumentUnknown)
                {
                    errMsg = "未知的文档类型";
                    return null;
                }
                SwDMClassFactory swDMClassFactory = new SwDMClassFactory();
                SwDMApplication swDMApp = swDMClassFactory.GetApplication(LinktronLicenseKey);
                if (swDMApp == null)
                {
                    Marshal.ReleaseComObject(swDMClassFactory);
                    errMsg = "SwDM 初始化失败";
                    return null;
                }
                SwDMDocument17 swDoc = (SwDMDocument17)swDMApp.GetDocument(filePath, docType, true, out var error1);
                if (swDoc == null)
                {
                    Marshal.ReleaseComObject(swDMApp);
                    Marshal.ReleaseComObject(swDMClassFactory);
                    errMsg = $"SwDM 加载文档失败,异常【{error1}】";
                    return null;
                }
                SwDMConfigurationMgr dmConfigMgr = swDoc.ConfigurationManager;
                if (dmConfigMgr == null)
                {
                    Marshal.ReleaseComObject(swDoc);
                    Marshal.ReleaseComObject(swDMApp);
                    Marshal.ReleaseComObject(swDMClassFactory);
                    errMsg = $"获取 ConfigurationManager 失败";
                    return null;
                }
                string configName = dmConfigMgr.GetActiveConfigurationName();
                SwDMConfiguration dmConfig = dmConfigMgr.GetConfigurationByName(configName);
                if (dmConfig == null)
                {
                    Marshal.ReleaseComObject(dmConfigMgr);
                    Marshal.ReleaseComObject(swDoc);
                    Marshal.ReleaseComObject(swDMApp);
                    Marshal.ReleaseComObject(swDMClassFactory);
                    errMsg = $"获取 Configuration 失败";
                    return null;
                }
                Dictionary<string, string> datas = new Dictionary<string, string>();
                string[] names = dmConfig.GetCustomPropertyNames();
                names = swDoc.GetCustomPropertyNames();
                foreach (string name in names)
                {
                    string val = swDoc.GetCustomProperty2(name, out var type);
                    datas.Add(name, val);
                }
                return datas;
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
                return null;
            }
        }
    }
}
PdmSwPlugin.Common/Util/UI/MultiExWindow.xaml.cs
@@ -3,8 +3,10 @@
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Web.UI.WebControls.WebParts;
using System.Windows;
using System.Windows.Interop;
namespace PdmSwPlugin.Common.Util.UI
{
@@ -30,6 +32,16 @@
            }
        }
        #endregion
        // Windows API 函数
        [DllImport("user32.dll", SetLastError = true)]
        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
        [DllImport("user32.dll", SetLastError = true)]
        private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
        private const int GWL_STYLE = -16;  // 窗口样式
        private const int WS_MINIMIZEBOX = 0x00020000;  // 最小化按钮样式
        private string _title;
        public string title
@@ -74,6 +86,14 @@
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // 获取窗口句柄
            IntPtr hWnd = new WindowInteropHelper(this).Handle;
            // 获取当前窗口的样式
            int currentStyle = GetWindowLong(hWnd, GWL_STYLE);
            // 移除最小化按钮
            SetWindowLong(hWnd, GWL_STYLE, currentStyle & ~WS_MINIMIZEBOX);
            Dispatcher.Invoke(() =>
            {
                table.ItemsSource = new ObservableCollection<string>(exceptions);
PdmSwPlugin.DrawApprove/DrawApprove.xaml
@@ -107,7 +107,7 @@
                <RowDefinition Height="20"/>
            </Grid.RowDefinitions>
            
            <ToolBarTray Grid.Row="0" DockPanel.Dock="Top" Background="#FFF" ToolBarTray.IsLocked="True" >
            <ToolBarTray Grid.Row="0" DockPanel.Dock="Top" Background="Transparent" ToolBarTray.IsLocked="True" >
                <ToolBar Style="{StaticResource CommonToolBar}" ToolBar.OverflowMode="Never" Band="1" BandIndex="1" Height="30" Background="#FFF">
                    <Button ToolTip="刷新" Content="&#xe631;刷新" FontFamily="{StaticResource iconfont}" FontSize="16"
     Click="Button_Click"/>
PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs
@@ -584,5 +584,10 @@
        {
        }
        public void DisabledHandler()
        {
        }
    }
}
PdmSwPlugin.DrawApprove/DrawAuditHisControl.xaml
@@ -60,7 +60,7 @@
        <Grid x:Name="sb">
            <DockPanel x:Name="content" LastChildFill="True">
                <ToolBarTray DockPanel.Dock="Top" Background="#FFF" ToolBarTray.IsLocked="True" >
                <ToolBarTray DockPanel.Dock="Top" Background="Transparent" ToolBarTray.IsLocked="True" >
                    <ToolBar Style="{StaticResource CommonToolBar}" ToolBar.OverflowMode="Never" Band="1" BandIndex="1" Height="30" Background="#FFF">
                        <Button ToolTip="刷新" Content="&#xe631;刷新" FontFamily="{StaticResource iconfont}" FontSize="16"
                    Click="Button_Click"/>
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.45";
        public static readonly string Version = "0.0.0.46";
    }
}
PdmSwPlugin.Main/MainControl.xaml
@@ -6,8 +6,7 @@
        xmlns:local="clr-namespace:PdmSwPlugin.Main" 
        d:DataContext="{d:DesignInstance Type=local:MainControl}"
        x:Name="self"
        mc:Ignorable="d"
        mc:Ignorable="d"
        HorizontalAlignment="Stretch"
        HorizontalContentAlignment="Stretch"
        VerticalContentAlignment="Stretch"
PdmSwPlugin.Main/MainControl.xaml.cs
@@ -266,7 +266,6 @@
        }
        public void SetSwApp(SldWorks SwApp)
        {
            this.SwApp = SwApp;
PdmSwPlugin.Main/MainTab.xaml
@@ -18,7 +18,18 @@
            <RowDefinition />
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <TabControl Grid.Row="0" x:Name="tabControl"></TabControl>
        <TabControl Grid.Row="0" x:Name="tabControl" Background="#f0f0f0">
            <TabControl.Resources>
                <Style TargetType="{x:Type TabItem}">
                    <Setter Property="FontSize" Value="16"/>
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="#f0f0f0"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TabControl.Resources>
        </TabControl>
        <DockPanel Grid.Row="1" Margin="0" LastChildFill="False">
            <Label DockPanel.Dock="Left" x:Name="userLabel" FontWeight="Bold" Padding="0" Margin="0,0,20,0" />
            <Button DockPanel.Dock="Left" Style="{StaticResource LinkButton}" Click="Button_Click">退出登录</Button>
PdmSwPlugin.Main/SwAddIn/MainControl.cs
@@ -379,6 +379,7 @@
                            ActiveDocCustomPropertyChange -= handler.OnCustomPropertyChange;
                            DocDestroy -= handler.OnDocDestroy;
                            AfterDocDestroy -= handler.AfterDocDestroy;
                            handler.DisabledHandler();
                        }
                    }
                    PluginInfos.Clear();
PdmSwPlugin.MaterialSelect/SwAddIn/MaterialSelectControl.cs
@@ -144,5 +144,9 @@
        {
            
        }
        public void DisabledHandler()
        {
        }
    }
}
PdmSwPlugin.PDM/PdmControl.xaml
@@ -314,7 +314,7 @@
                <RowDefinition Height="*" />
                <RowDefinition Height="20"/>
            </Grid.RowDefinitions>
            <ToolBarTray Grid.Row="0" Background="#FFF" ToolBarTray.IsLocked="True" >
            <ToolBarTray Grid.Row="0" Background="Transparent" ToolBarTray.IsLocked="True">
                <ToolBar Style="{StaticResource CommonToolBar}" ToolBar.OverflowMode="Never" Band="1" BandIndex="1" Height="30" Background="#FFF">
                    <Button ToolTip="刷新" Content="&#xe631;刷新" FontFamily="{StaticResource iconfont}" FontSize="16"
        Click="Refresh_Click"/>
PdmSwPlugin.PDM/PdmControl.xaml.cs
@@ -1,5 +1,6 @@
using log4net;
using Microsoft.Win32;
using NPOI.SS.Formula.PTG;
using NPOI.SS.UserModel;
using NPOI.Util;
using NPOI.XSSF.UserModel;
@@ -55,6 +56,8 @@
        private HttpClientCreator clientCreator { get; set; }
        private volatile PdmStatus workStatus;
        private TaskFactory taskFactory = LimitedConcurrencyLevelTaskSchedulerMsn.Factory;
        SldWorks ISwAppSetter.SwApp => SwApp;
@@ -904,79 +907,6 @@
            //throw new NotImplementedException();
        }
        public Dictionary<string, DrawInfo> GetAllProperties(List<string> ErrMsgs)
        {
            ConcurrentDictionary<string, DrawInfo> result = new ConcurrentDictionary<string, DrawInfo>();
            PdmBom topBom = model.BomTree[0];
            CountdownEvent counter = new CountdownEvent(1);
            _ = ThreadPool.QueueUserWorkItem(
                new WaitCallback(GetAll),
                new object[] {
                    topBom, result, counter, ErrMsgs, 0}
                );
            counter.Wait();
            counter.Dispose();
            return new Dictionary<string, DrawInfo>(result);
        }
        /// <summary>
        /// 获取全部属性
        /// </summary>
        /// <param name="param"></param>
        public void GetAll(object param)
        {
            object[] datas = param as object[];
            PdmBom bom = (PdmBom)datas[0];
            ModelDoc2 sldDoc = bom.doc;
            Component2 component = bom.component;
            ConcurrentDictionary<string, DrawInfo> result = (ConcurrentDictionary<string, DrawInfo>)datas[1];
            CountdownEvent counter = (CountdownEvent)datas[2];
            List<string> ErrMsgs = (List<string>)datas[3];
            int level = (int)datas[4];
            try
            {
                counter.TryAddCount();
                string filepath = bom.partNo;
                if (result.ContainsKey(filepath))
                {
                    return;
                }
                if (!bom.skipCheck)
                {
                    result[filepath] = GetSingleDrawInfo(bom);
                }
                ObservableCollection<PdmBom> children = bom.modules;
                if (children != null)
                {
                    foreach (PdmBom child in children)
                    {
                        _ = ThreadPool.QueueUserWorkItem(
                              new WaitCallback(GetAll),
                              new object[] { child, result, counter, ErrMsgs, 1 });
                    }
                }
                MaskAdorner.ShowMessage(content, filepath);
            }
            catch (Exception e)
            {
                bom.drawInfo.checkRuleResult = 2;
                bom.drawInfo.errMessages = new List<string> { e.Message };
                Logger.Error($"V{PdmUser.LoginUser.pluginVersion},[{bom.filePath}] Read MASS Properies Failed.", e);
            }
            finally
            {
                counter.Signal();
                if (level == 0)
                {
                    counter.Signal();
                }
            }
        }
        /// <summary>
        /// 处理质量,保留6位小数
        /// </summary>
@@ -1028,7 +958,10 @@
            }
            // 文件保存状态
            allProperties["图纸保存状态"] = sldDoc.GetSaveFlag().ToString();
            Dictionary<string, string> properties = CustomPropertyUtil.GetCustomProperties(sldDoc, true);
            Dictionary<string, string> properties = CustomPropertyUtil.GetCustomProperties2(sldDoc, true, new HashSet<string>
            {
                "重量"
            }, null);
            // 图纸属性
            if (properties != null)
            {
@@ -1039,18 +972,39 @@
            }
            if (drawExists)
            {
                string refPath = SwDMUtil.GetDrawingRef(drawFilePath, out string errMsg);
                if (refPath == null)
                string[] refs = SwDMUtil.GetDrawingRef2(drawFilePath, out string err, out int[] status);
                string refPath = "";
                if (refs != null && refs.Length > 0)
                {
                    Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, [{drawFilePath}] Read slddrw Ref Path Failed.[{errMsg}]");
                    foreach (var rf in refs)
                    {
                        if (string.Equals(rf, filepath, StringComparison.CurrentCultureIgnoreCase))
                        {
                            refPath = rf;
                            refPath = Path.GetFileName(refPath);
                            break;
                        }
                    }
                }
                else
                {
                    refPath = Path.GetFileName(refPath);
                    Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, [{drawFilePath}] Read slddrw Ref Path Failed.[{err}]");
                }
                //string refPath = SwDMUtil.GetDrawingRef(drawFilePath, out string errMsg);
                //if (refPath == null)
                //{
                //    Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, [{drawFilePath}] Read slddrw Ref Path Failed.[{errMsg}]");
                //}
                //else
                //{
                //    refPath = Path.GetFileName(refPath);
                //}
                Logger.Debug($"V{PdmUser.LoginUser.pluginVersion},文档路径:【{filepath}】\r\n" +
                    $"工程图路径:【{drawFilePath}】\r\n" +
                    $"文件全称:【{allProperties["文件全称"]}】\r\n" +
                    $"Result:【{string.Join(",", refs ?? new string[] { })}】\r\n" +
                    $"Status:【{string.Join(",", status ?? new int[] { })}】\r\n" +
                    $"引用路径:【{refPath}】");
                allProperties["工程图引用文件"] = refPath;
            }
@@ -1084,13 +1038,14 @@
            ConcurrentDictionary<string, DrawInfo> result = new ConcurrentDictionary<string, DrawInfo>();
            PdmBom topBom = model.BomTree[0];
            CountdownEvent counter = new CountdownEvent(1);
            Task.Run(() =>
            taskFactory.StartNew(() =>
            {
                GetAllByTask(new object[] {
                topBom, result, counter, ErrMsgs, 0 });
            });
            counter.Wait();
            counter.Dispose();
            // 不需要手动释放
            //counter.Dispose();
            return new Dictionary<string, DrawInfo>(result);
        }
@@ -1131,7 +1086,7 @@
                {
                    foreach (PdmBom child in children)
                    {
                        Task.Run(() =>
                        taskFactory.StartNew(() =>
                        {
                            GetAllByTask(new object[] { child, result, counter, ErrMsgs, 1 });
                        });
@@ -1155,44 +1110,6 @@
            }
        }
        /// <summary>
        /// 对当前展示的BOM结构进行规则检查
        /// </summary>
        /// <returns>是否全部通过</returns>
        public bool DoCheckRule(out List<string> messages)
        {
            messages = new List<string>();
            bool allSuccess = true;
            Dictionary<string, DrawInfo> properties = GetAllProperties(messages);
            MaskAdorner.ShowMessage(content, "正在请求数据...");
            Result<Dictionary<string, DrawInfo>> result = Client.PostSyncAction<Dictionary<string, DrawInfo>>(
                new PdmBomParam
                {
                    needCheckProperties = properties
                }, "wpf/bom/openApi/checkRule2");
            Dictionary<string, DrawInfo> checkResult = result.HandleResult();
            foreach (string key in properties.Keys)
            {
                properties[key].checkRuleResult = checkResult[key].checkRuleResult;
                properties[key].errMessages = checkResult[key].errMessages;
                var msgs = checkResult[key].errMessages;
                if (!properties[key].HistoryData && !checkResult[key].checkRuleOk)
                {
                    // 不是历史数据并且有未通过的,标记为false
                    allSuccess = false;
                }
                if (!properties[key].HistoryData && msgs != null && msgs.Count > 0)
                {
                    foreach (string msg in msgs)
                    {
                        messages.Add($"物料【{key}】未通过规则检查!{msg}");
                    }
                }
            }
            return allSuccess;
        }
        public bool DoCheckRuleAsync(out List<string> messages)
        {
            var temp = new List<string>();
@@ -1202,16 +1119,19 @@
            // var factory = LimitedConcurrencyLevelTaskScheduler.Factory;
            CountdownEvent counter = new CountdownEvent(properties.Count);
            int iii = 0;
            var start = DateTime.Now;
            Logger.Debug("DoCheckRuleAsync Start...");
            foreach (KeyValuePair<string, DrawInfo> property in properties)
            {
                /// 这个方法最快,但不好管控,因为不知道属性字典有多大
                Task.Run(() =>
                /// Task.Run 这个方法最快,但不好管控,因为不知道属性字典有多大
                /// taskFactory.StartNew 稳定一点吗?
                taskFactory.StartNew(() =>
                {
                    string key = property.Key;
                    iii++;
                    try
                    {
                        Logger.Error($"{key} checking rule...");
                        Logger.Debug($"{key} checking rule...");
                        DrawInfo checkResult;
                        Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
                        checkResult = result.HandleResult();
@@ -1407,6 +1327,7 @@
            counter.Wait();
            counter.Dispose();
            messages = temp;
            Logger.Debug($"DoCheckRuleAsync Ended in {(DateTime.Now - start).TotalMilliseconds}ms.");
            return allSuccess;
        }
@@ -1415,7 +1336,7 @@
            IntPtr winformWindow = Process.GetCurrentProcess().MainWindowHandle;
            if (winformWindow != null)
                new WindowInteropHelper(exWin) { Owner = winformWindow };
            exWin.Show();
            exWin.ShowDialog();
        }
        /// <summary>
@@ -1585,7 +1506,7 @@
                    ConcurrentQueue<string> pathCache = new ConcurrentQueue<string>(boms.Select(b => b.filePath).ToList());
                    foreach (PdmBom bom in boms)
                    {
                        Task.Run(() =>
                        taskFactory.StartNew(() =>
                        {
                            try
                            {
@@ -1825,7 +1746,7 @@
                    if (errs.Count > 0)
                    {
                        MultiExWindow exWin = new MultiExWindow(this, "检查结果", errs);
                        exWin.ShowDialog();
                        ShowExWindow(exWin);
                    }
                    else if (bom.checkRuleResult == 3)
                    {
@@ -2165,5 +2086,10 @@
        {
        }
        public void DisabledHandler()
        {
        }
    }
}
PdmSwPlugin.PropertySetting/CommonSettingControl.xaml
@@ -3,19 +3,43 @@
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/PdmSwPlugin.Common;component/Style/ToolBar.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <Style TargetType="Button">
                <Setter Property="FontSize" Value="16"/>
            </Style>
            <Style TargetType="UserControl">
                <Setter Property="FontSize" Value="16"/>
            </Style>
            <Style TargetType="TextBox">
                <Setter Property="FontSize" Value="16"/>
            </Style>
            <Style TargetType="Label">
                <Setter Property="FontSize" Value="14"/>
            </Style>
            <Style TargetType="ComboBox">
                <Setter Property="FontSize" Value="16"/>
            </Style>
            <Style TargetType="ComboBoxItem">
                <Setter Property="FontSize" Value="16"/>
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>
    <StackPanel>
        <ToolBarTray Background="#FFF" ToolBarTray.IsLocked="True" >
            <ToolBar Style="{StaticResource CommonToolBar}" ToolBar.OverflowMode="Never" Band="1" BandIndex="1" Height="30" Background="#FFF">
        <ToolBarTray Background="Transparent" ToolBarTray.IsLocked="True" >
            <ToolBar Style="{StaticResource CommonToolBar}" ToolBar.OverflowMode="Never" Band="1" BandIndex="1" Height="30">
                <Button ToolTip="刷新" Content="&#xe631;刷新" Click="Refresh_Click" FontSize="16"/>
                <Button ToolTip="保存" Content="&#xe60d;保存" FontFamily="{StaticResource iconfont}" FontSize="16"
PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs
@@ -25,7 +25,7 @@
using System.IO;
using System.Collections.ObjectModel;
using System.Runtime.InteropServices;
using System.Diagnostics;
using PdmSwPlugin.PropertySetting.Util;
namespace PdmSwPlugin.PropertySetting
{
@@ -67,12 +67,16 @@
            Dictionary<string, string> datas = properties as Dictionary<string, string>;
            (container as UIElement).Dispatcher.Invoke(() =>
            {
                var props = container.GetType().GetProperties().Where(prop => System.Attribute.IsDefined(prop, typeof(PropertySettingAttr)))
               .ToList();
                // PropHolder.SetPropToUI(container, datas);
                foreach (var prop in props)
                Dictionary<PropertyInfo, PropertySettingAttr> map = PropHolder.GetAttrMap(container.GetType());
                if (map == null)
                {
                    PropertySettingAttr attr = prop.GetCustomAttribute<PropertySettingAttr>();
                    return;
                }
                foreach (var prop in map.Keys)
                {
                    PropertySettingAttr attr = map[prop];
                    if (attr == null || !attr.NeedInit)
                    {
                        continue;
@@ -89,8 +93,32 @@
                        // 其他写入initData
                        if (initData != null) initData[name] = value;
                    }
                    prop.SetValue(container, value);
                    PropHolder.SetPropToUI(container, prop, value);
                }
                // var props = container.GetType().GetProperties().Where(prop => System.Attribute.IsDefined(prop, typeof(PropertySettingAttr)))
                //.ToList();
                // foreach (var prop in props)
                // {
                //     PropertySettingAttr attr = prop.GetCustomAttribute<PropertySettingAttr>();
                //     if (attr == null || !attr.NeedInit)
                //     {
                //         continue;
                //     }
                //     string name = attr.Name;
                //     string value = datas.Get(name, string.Empty);
                //     if (string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(attr.defaultValue))
                //     {
                //         value = attr.defaultValue;
                //         // 默认值不写入initData
                //     }
                //     else
                //     {
                //         // 其他写入initData
                //         if (initData != null) initData[name] = value;
                //     }
                //     prop.SetValue(container, value);
                // }
            });
            return true;
        }
@@ -232,6 +260,18 @@
            this.SwApp = SwApp;
        }
        public Dictionary<string, string> GetPropsWithLog(ModelDoc2 currentModelDoc,
            bool needResolve,
            HashSet<string> skipName,
            HashSet<string> skipResolveName)
        {
            if (currentModelDoc == null) return null;
            var start = DateTime.Now;
            var data = CustomPropertyUtil.GetCustomProperties2(currentModelDoc, needResolve, skipName, skipResolveName);
            Logger.Debug($"Get Props {(DateTime.Now - start).TotalMilliseconds} ms.");
            return data;
        }
        public void InitPropertyData()
        {
            try
@@ -292,7 +332,7 @@
        private void UpdateActiveDoc()
        {
            long start = DateTime.Now.Millisecond;
            var start = DateTime.Now;
            Logger.Debug("UpdateActiveDoc Start...");
            if (activeDoc != null)
            {
@@ -309,11 +349,8 @@
                    activeDoc.ClearSelection2(true);
                }
            }
            Logger.Debug($"UpdateActiveDoc End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
            start = DateTime.Now.Millisecond;
            Logger.Debug("UpdateUI Start...");
            Logger.Debug($"UpdateActiveDoc End {activeDoc?.GetPathName()} {(DateTime.Now - start).TotalMilliseconds}ms.");
            UpdateUI(activeDoc);
            Logger.Debug($"UpdateUI End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
        }
        /// <summary>
@@ -390,15 +427,13 @@
        public void UpdateUI(ModelDoc2 doc)
        {
            var start = DateTime.Now;
            Logger.Debug("UpdateUI Start...");
            AlertSaveWindow();
            LastReadDoc = ReadDoc;
            ReadDoc = doc;
            Dispatcher.Invoke(() =>
            {
                // LoadDocProperties();
            });
            SwitchVisiable();
            Logger.Debug($"UpdateUI End {activeDoc?.GetPathName()} {(DateTime.Now - start).TotalMilliseconds}ms.");
        }
        private int Ass_UserSelectionPostNotify()
@@ -433,10 +468,15 @@
        /// </summary>
        private void SwitchVisiable()
        {
            var start = DateTime.Now.Millisecond;
            var start = DateTime.Now;
            Logger.Debug("SwitchVisiable Start...");
            HashSet<string> skipName = new HashSet<string> {
            HashSet<string> skipName = new HashSet<string>
            {
                NameConstant.weight
            };
            HashSet<string> skipResolveName = new HashSet<string> {
                NameConstant.materialCode
            };
@@ -457,7 +497,7 @@
            else if (docType == (int)swDocumentTypes_e.swDocPART)
            {
                ReadDocPath = ReadDoc.GetPathName();
                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
                properties = GetPropsWithLog(ReadDoc, true, skipName, skipResolveName);
                string fileType = properties.Get(NameConstant.docType);
                /*if (fileType == "加工件" || fileType == "模组")
                {
@@ -495,7 +535,7 @@
                else
                {
                    // !Equals(LastReadDoc, ReadDoc)
                    properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
                    properties = GetPropsWithLog(ReadDoc, true, skipName, skipResolveName);
                    string fileType = properties.Get(NameConstant.docType);
                    /*if (fileType == "加工件" || fileType == "模组")
                    {
@@ -547,162 +587,13 @@
                contentPanel.Children.Add(control);
            });
            Logger.Debug($"SwitchVisiable End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
        }
        /// <summary>
        /// 根据激活的文档类型,变更属性可视
        /// </summary>
        private void SwitchVisiable2()
        {
            HashSet<string> skipName = new HashSet<string> {
                NameConstant.materialCode
            };
            IPropertyOpt last = ActiveOpter as IPropertyOpt;
            string contentKey = "default";
            int? docType = ReadDoc?.GetType();
            UserControl control;
            IPropertyOpt newOne;
            Dictionary<string, string> properties;
            if (docType == (int)swDocumentTypes_e.swDocDRAWING)
            {
                ReadDocPath = ReadDoc.GetPathName();
                control = new DefaultPanel();
                newOne = control as IPropertyOpt;
                newOne.SetSettings(settings);
                newOne.SetProperties(null, "当前不支持工程图", true, out _);
            }
            else if (docType == (int)swDocumentTypes_e.swDocPART)
            {
                ReadDocPath = ReadDoc.GetPathName();
                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
                string fileType = properties.Get(NameConstant.docType);
                /*if (fileType == "加工件" || fileType == "模组")
                {
                    contentKey = "jgjPart";
                }*/
                if (BomIniterHolder.Instance.IsJgj(ReadDoc))
                {
                    control = new JgjPartPanel();
                }
                else
                {
                    control = new StandardPartPanel();
                }
                newOne = control as IPropertyOpt;
                newOne.SetSettings(settings);
                newOne.SetProperties(ReadDoc, properties, true, out _);
            }
            else if (docType == (int)swDocumentTypes_e.swDocASSEMBLY)
            {
                ReadDocPath = ReadDoc.GetPathName();
                // !Equals(LastReadDoc, ReadDoc)
                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
                string fileType = properties.Get(NameConstant.docType);
                /*if (fileType == "加工件" || fileType == "模组")
                {
                    contentKey = "jgjPart";
                }*/
                if (BomIniterHolder.Instance.IsJgj(ReadDoc))
                {
                    control = new JgjModulePanel();
                }
                else
                {
                    control = new StandardModulePanel();
                }
                newOne = control as IPropertyOpt;
                newOne.SetSettings(settings);
                newOne.SetProperties(ReadDoc, properties, true, out _);
            }
            else
            {
                control = new DefaultPanel();
                newOne = control as IPropertyOpt;
                string PathName = ReadComponent?.GetPathName();
                if (PathName == null)
                {
                    ReadDocPath = "";
                    newOne.SetSettings(settings);
                    newOne.SetProperties(ReadDoc, "请打开一个文档", true, out _);
                }
                else
                {
                    ReadDocPath = PathName;
                    string name = Path.GetFileNameWithoutExtension(PathName);
                    newOne.SetSettings(settings);
                    newOne.SetProperties(ReadDoc, $"【{name}】未找到文档,请检查是否被压缩或轻量化", true, out _);
                }
            }
            if (last != null)
            {
                last.UpdateProperty -= Jgj_SinglePropertyChanged;
                last = null;
            }
            ActiveOpter = control;
            contentPanel.Children.Clear();
            newOne.UpdateProperty += Jgj_SinglePropertyChanged;
            contentPanel.Children.Add(control);
        }
        /// <summary>
        /// 从激活的文档中读取参数
        /// </summary>
        private void LoadDocProperties()
        {
            IPropertyOpt opt = ActiveOpter as IPropertyOpt;
            string ErrMsg = null;
            if (ReadDoc == null)
            {
                string PathName = ReadComponent?.GetPathName();
                if (PathName == null)
                {
                    ReadDocPath = "";
                    opt.SetProperties(ReadDoc, "请打开一个文档", true, out ErrMsg);
                    return;
                }
                ReadDocPath = PathName;
                string name = Path.GetFileNameWithoutExtension(PathName);
                opt.SetProperties(ReadDoc, $"【{name}】未找到文档,请检查是否被压缩或轻量化", true, out ErrMsg);
                return;
            }
            int docType = ReadDoc.GetType();
            ReadDocPath = ReadDoc.GetPathName();
            if (docType == (int)swDocumentTypes_e.swDocDRAWING)
            {
                opt.SetProperties(null, "当前不支持工程图", true, out ErrMsg);
                return;
            }
            HashSet<string> skipName = new HashSet<string> {
                NameConstant.materialCode
            };
            Dictionary<string, string> properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
            opt.SetProperties(ReadDoc, properties, !Equals(LastReadDoc, ReadDoc), out ErrMsg);
        }
        private void ClearDocProperties()
        {
            IPropertyOpt opt = ActiveOpter as IPropertyOpt;
            opt.ClearAllProperties(out string ErrMsg);
        }
        /// <summary>
        /// 将属性设置进文档,注意,并没有保存
        /// </summary>
        /// <param name="doc">文档</param>
        private void SetDocProperty(ModelDoc2 doc, Dictionary<string, string> props)
        {
            CustomPropertyUtil.SetCustomProperties(doc, props);
            Logger.Debug($"SwitchVisiable End {activeDoc?.GetPathName()} {(DateTime.Now - start).TotalMilliseconds}ms.");
        }
        public void SetSwApp(SldWorks SwApp)
        {
            this.SwApp = SwApp;
        }
        private void SaveDoc(bool qiaoqiaode)
        {
@@ -735,6 +626,8 @@
        public void RefreshData()
        {
            MaskAdorner.ShowMask(content, "属性加载中,请稍候...");
            var start = DateTime.Now;
            Logger.Debug($"Refresh [{ReadDocPath}] Data start.");
            Task.Run(() =>
            {
                try
@@ -754,6 +647,7 @@
                finally
                {
                    MaskAdorner.HideMask(content);
                    Logger.Debug($"Refresh [{ReadDocPath}] Data end {(DateTime.Now - start).TotalMilliseconds}ms.");
                }
            });
        }
@@ -792,7 +686,6 @@
        /// <param name="comp"></param>
        public void OnSwActiveDocChange(ModelDoc2 lastDoc, ModelDoc2 doc, Component2 comp)
        {
            // CurrentChanged();
            RefreshData();
        }
@@ -835,7 +728,7 @@
        /// </summary>
        public void AlertSaveWindow()
        {
            var start = DateTime.Now.Millisecond;
            var start = DateTime.Now;
            Logger.Debug("AlertSaveWindow Start...");
            IPropertyOpt opt = ActiveOpter as IPropertyOpt;
            if (opt != null && opt.GetDocChanged())
@@ -859,7 +752,7 @@
                    opt.ResetProperty(out string errMsg);
                }
            }
            Logger.Debug($"AlertSaveWindow End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
            Logger.Debug($"AlertSaveWindow End {activeDoc?.GetPathName()} {(DateTime.Now - start).TotalMilliseconds}ms.");
        }
        public void OnTabControlSelectionChange(object sender, SelectionChangedEventArgs e)
@@ -893,5 +786,13 @@
                this.Error($"{ex.Message}");
            }
        }
        public void DisabledHandler()
        {
            if (activeDoc != null)
            {
                DetachDocNotify(activeDoc);
            }
        }
    }
}
PdmSwPlugin.PropertySetting/Panel/DefaultPanel.xaml.cs
@@ -49,7 +49,6 @@
            set => RaiseAndSetIfChanged(ref _message, value);
        }
        public DefaultPanel()
        {
            DataContext = this;
PdmSwPlugin.PropertySetting/Panel/JgjModulePanel.xaml
@@ -5,7 +5,7 @@
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" 
             x:Name="self"
             d:DesignHeight="900" d:DesignWidth="800" Background="#FFF">
             d:DesignHeight="900" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
PdmSwPlugin.PropertySetting/Panel/JgjModulePanel.xaml.cs
@@ -9,6 +9,7 @@
using PdmSwPlugin.PropertySetting.Entity;
using PdmSwPlugin.PropertySetting.Interface;
using PdmSwPlugin.PropertySetting.Panel.Attr;
using PdmSwPlugin.PropertySetting.Util;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
@@ -51,6 +52,11 @@
            }
        }
        #endregion
        static JgjModulePanel()
        {
            PropHolder.Register(typeof(JgjModulePanel));
        }
        public event PanelPropertyChanged UpdateProperty;
@@ -221,7 +227,7 @@
        [PropertySettingAttr(Name = NameConstant.weight, NeedSave = false)]
        public string weight
        {
            get => CustomPropertyUtil.GetMass(doc);
            get => CustomPropertyUtil.GetMassBySWDM(doc);
            set
            {
                ccc(ref _weight, value);
PdmSwPlugin.PropertySetting/Panel/JgjPartPanel.xaml
@@ -5,7 +5,7 @@
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" 
             x:Name="self"
             d:DesignHeight="900" d:DesignWidth="800" Background="#FFF">
             d:DesignHeight="900" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
PdmSwPlugin.PropertySetting/Panel/JgjPartPanel.xaml.cs
@@ -9,6 +9,7 @@
using PdmSwPlugin.PropertySetting.Entity;
using PdmSwPlugin.PropertySetting.Interface;
using PdmSwPlugin.PropertySetting.Panel.Attr;
using PdmSwPlugin.PropertySetting.Util;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
@@ -41,6 +42,11 @@
            }
        }
        #endregion
        static JgjPartPanel()
        {
            PropHolder.Register(typeof(JgjPartPanel));
        }
        public void ccc<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
@@ -198,7 +204,7 @@
        [PropertySettingAttr(Name = NameConstant.weight, NeedSave = false)]
        public string weight
        {
            get => CustomPropertyUtil.GetMass(doc);
            get => CustomPropertyUtil.GetMassBySWDM(doc);
            set
            {
                ccc(ref _weight, value);
PdmSwPlugin.PropertySetting/Panel/StandardModulePanel.xaml
@@ -6,7 +6,7 @@
             mc:Ignorable="d" 
             x:Name="self"
             VerticalContentAlignment="Stretch"
             d:DesignHeight="900" d:DesignWidth="800" Background="#FFF">
             d:DesignHeight="900" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
PdmSwPlugin.PropertySetting/Panel/StandardModulePanel.xaml.cs
@@ -7,6 +7,7 @@
using PdmSwPlugin.Common.Util;
using PdmSwPlugin.PropertySetting.Interface;
using PdmSwPlugin.PropertySetting.Panel.Attr;
using PdmSwPlugin.PropertySetting.Util;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
@@ -39,6 +40,11 @@
            }
        }
        #endregion
        static StandardModulePanel()
        {
            PropHolder.Register(typeof(StandardModulePanel));
        }
        public event PanelPropertyChanged UpdateProperty;
@@ -95,7 +101,7 @@
        [PropertySettingAttr(Name = NameConstant.weight, NeedSave = false)]
        public string weight
        {
            get => CustomPropertyUtil.GetMass(doc);
            get => CustomPropertyUtil.GetMassBySWDM(doc);
            set
            {
                RaiseAndSetIfChanged(ref _weight, value);
PdmSwPlugin.PropertySetting/Panel/StandardPartPanel.xaml
@@ -6,7 +6,7 @@
             xmlns:local="clr-namespace:PdmSwPlugin.PropertySetting"
             mc:Ignorable="d" 
             x:Name="self"
             d:DesignHeight="900" d:DesignWidth="800" Background="#FFF">
             d:DesignHeight="900" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
PdmSwPlugin.PropertySetting/Panel/StandardPartPanel.xaml.cs
@@ -7,6 +7,7 @@
using PdmSwPlugin.Common.Util;
using PdmSwPlugin.PropertySetting.Interface;
using PdmSwPlugin.PropertySetting.Panel.Attr;
using PdmSwPlugin.PropertySetting.Util;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
@@ -39,6 +40,11 @@
            }
        }
        #endregion
        static StandardPartPanel()
        {
            PropHolder.Register(typeof(StandardPartPanel));
        }
        private Dictionary<string, string> InitData = new Dictionary<string, string>();
@@ -93,7 +99,7 @@
        [PropertySettingAttr(Name = NameConstant.weight, NeedSave = false)]
        public string weight
        {
            get => CustomPropertyUtil.GetMass(doc);
            get => CustomPropertyUtil.GetMassBySWDM(doc);
            set
            {
                RaiseAndSetIfChanged(ref _weight, value);
PdmSwPlugin.PropertySetting/PdmSwPlugin.PropertySetting.csproj
@@ -139,6 +139,8 @@
    <Compile Include="Tab\JgjPartTab.xaml.cs">
      <DependentUpon>JgjPartTab.xaml</DependentUpon>
    </Compile>
    <Compile Include="Util\PropHolder.cs" />
    <Compile Include="Util\PropSetter.cs" />
    <Page Include="SettingControl.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
PdmSwPlugin.PropertySetting/PropertySettingControl.xaml.cs
@@ -754,5 +754,10 @@
        {
        }
        public void DisabledHandler()
        {
        }
    }
}
PdmSwPlugin.PropertySetting/SettingControl.xaml.cs
@@ -337,7 +337,7 @@
            else if (docType == (int)swDocumentTypes_e.swDocPART)
            {
                ReadDocPath = ReadDoc.GetPathName();
                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, null, skipName);
                string fileType = properties.Get(NameConstant.docType);
                /*if (fileType == "加工件" || fileType == "模组")
                {
@@ -375,7 +375,7 @@
                else
                {
                    // !Equals(LastReadDoc, ReadDoc)
                    properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
                    properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, null, skipName);
                    string fileType = properties.Get(NameConstant.docType);
                    /*if (fileType == "加工件" || fileType == "模组")
                    {
@@ -451,7 +451,7 @@
            else if (docType == (int)swDocumentTypes_e.swDocPART)
            {
                ReadDocPath = ReadDoc.GetPathName();
                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, null, skipName);
                string fileType = properties.Get(NameConstant.docType);
                /*if (fileType == "加工件" || fileType == "模组")
                {
@@ -473,7 +473,7 @@
            {
                ReadDocPath = ReadDoc.GetPathName();
                // !Equals(LastReadDoc, ReadDoc)
                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, null, skipName);
                string fileType = properties.Get(NameConstant.docType);
                /*if (fileType == "加工件" || fileType == "模组")
                {
@@ -553,7 +553,7 @@
            HashSet<string> skipName = new HashSet<string> {
                NameConstant.materialCode
            };
            Dictionary<string, string> properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
            Dictionary<string, string> properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, null, skipName);
            opt.SetProperties(ReadDoc, properties, !Equals(LastReadDoc, ReadDoc), out ErrMsg);
        }
@@ -711,5 +711,10 @@
                }
            }
        }
        public void DisabledHandler()
        {
        }
    }
}
PdmSwPlugin.PropertySetting/Util/PropHolder.cs
New file
@@ -0,0 +1,65 @@
using PdmSwPlugin.Common.Util;
using PdmSwPlugin.PropertySetting.Panel;
using PdmSwPlugin.PropertySetting.Panel.Attr;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace PdmSwPlugin.PropertySetting.Util
{
    public class PropHolder
    {
        private static readonly Dictionary<Type, Dictionary<PropertyInfo, PropertySettingAttr>> context
            = new Dictionary<Type, Dictionary<PropertyInfo, PropertySettingAttr>>();
        private static readonly Dictionary<PropertyInfo, SetValueDelegate> setters = new Dictionary<PropertyInfo, SetValueDelegate>();
        public static void Register(Type type)
        {
            if (context.ContainsKey(type))
            {
                return;
            }
            Dictionary<PropertyInfo, PropertySettingAttr> map = new Dictionary<PropertyInfo, PropertySettingAttr>();
            var props = type.GetProperties().Where(prop => System.Attribute.IsDefined(prop, typeof(PropertySettingAttr)))
              .ToList();
            foreach (var prop in props)
            {
                PropertySettingAttr attr = prop.GetCustomAttribute<PropertySettingAttr>();
                if (attr == null || !attr.NeedInit)
                {
                    continue;
                }
                map.Add(prop, attr);
                setters.Add(prop, PropSetter.CreatePropertySetter(prop));
            }
            context.Add(type, map);
        }
        public static Dictionary<PropertyInfo, PropertySettingAttr> GetAttrMap(Type type)
        {
            if (!context.ContainsKey(type))
            {
                return null;
            }
            return context[type];
        }
        public static void SetPropToUI(object container, PropertyInfo prop, object value)
        {
            if (setters.ContainsKey(prop))
            {
                setters[prop](container, value);
            }
        }
    }
}
PdmSwPlugin.PropertySetting/Util/PropSetter.cs
New file
@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace PdmSwPlugin.PropertySetting.Util
{
    public delegate void SetValueDelegate(object target, object arg);
    public static class PropSetter
    {
        public static SetValueDelegate CreatePropertySetter(PropertyInfo property)
        {
            if (property == null)
                throw new ArgumentNullException("property");
            if (!property.CanWrite)
                return null;
            MethodInfo setMethod = property.GetSetMethod(true);
            DynamicMethod dm = new DynamicMethod("PropertySetter", null,
                new Type[] { typeof(object), typeof(object) }, property.DeclaringType, true);
            ILGenerator il = dm.GetILGenerator();
            if (!setMethod.IsStatic)
            {
                il.Emit(OpCodes.Ldarg_0);
            }
            il.Emit(OpCodes.Ldarg_1);
            EmitCastToReference(il, property.PropertyType);
            if (!setMethod.IsStatic && !property.DeclaringType.IsValueType)
            {
                il.EmitCall(OpCodes.Callvirt, setMethod, null);
            }
            else
                il.EmitCall(OpCodes.Call, setMethod, null);
            il.Emit(OpCodes.Ret);
            return (SetValueDelegate)dm.CreateDelegate(typeof(SetValueDelegate));
        }
        private static void EmitCastToReference(ILGenerator il, Type type)
        {
            if (type.IsValueType)
                il.Emit(OpCodes.Unbox_Any, type);
            else
                il.Emit(OpCodes.Castclass, type);
        }
    }
}