加密解密,工程量表

This commit is contained in:
GG Z
2021-07-22 10:52:26 +08:00
parent b1ae302dab
commit 7acdacedf3
15 changed files with 487 additions and 67 deletions

View File

@@ -0,0 +1,78 @@
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using RookieStation.CommonTools.ViewModels;
using RookieStation.Extension;
using RookieStation.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RookieStation.CommonTools.ExecuteCmd
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
internal class CmdDecryptFamily : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiapp = commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
Document doc = uidoc.Document;
DocumentSet docset = uiapp.Application.Documents;
TaskDialog dialog = new TaskDialog("解密族");
dialog.MainInstruction = "请选择当前项目解密族的范围";
dialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "已使用的族");
dialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, "所有族");
TaskDialogResult taskDialogResult = dialog.Show();
if (TaskDialogResult.CommandLink1 == taskDialogResult)
{
var instances = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).Cast<FamilyInstance>();
var distinctFamiliesUsed = instances.GroupBy(f => f.Symbol.FamilyName).Select(f => f.FirstOrDefault()).ToList().ConvertAll(f => f.Symbol.Family);
try
{
doc.InvokeGroup(tg =>
{
EncryptOrDecryptFamily decryptFamily = new EncryptOrDecryptFamily(distinctFamiliesUsed);
decryptFamily.IsEncrypt = false;
decryptFamily.ProgressModal();
}, "解密使用族");
}
catch (Exception ex)
{
if (!(ex is Autodesk.Revit.Exceptions.OperationCanceledException))
{
Log.WriteLog(ex.Message);
return Result.Failed;
}
}
}
else if (TaskDialogResult.CommandLink2 == taskDialogResult)
{
var families = new FilteredElementCollector(doc).OfClass(typeof(Family)).Cast<Family>().ToList();
try
{
doc.InvokeGroup(tg =>
{
EncryptOrDecryptFamily decryptFamily = new EncryptOrDecryptFamily(families);
decryptFamily.IsEncrypt = false;
decryptFamily.ProgressModal();
}, "解密所有族");
}
catch (Exception ex)
{
if (!(ex is Autodesk.Revit.Exceptions.OperationCanceledException))
{
Log.WriteLog(ex.Message);
return Result.Failed;
}
}
}
return Result.Succeeded;
}
}
}

View File

@@ -1,6 +1,7 @@
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using RookieStation.CommonTools.ViewModels;
using RookieStation.Extension;
using RookieStation.Utils;
using System;
@@ -22,69 +23,56 @@ namespace RookieStation.CommonTools.ExecuteCmd
Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
Document doc = uidoc.Document;
DocumentSet docset = uiapp.Application.Documents;
var instances = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).Cast<FamilyInstance>();
var distinctInstances = instances.GroupBy(f => f.Symbol.FamilyName).Select(f => f.FirstOrDefault());
TaskDialog dialog = new TaskDialog("加密族");
dialog.MainInstruction = "请选择当前项目加密族的范围";
dialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "已使用的族");
dialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, "所有族");
TaskDialogResult taskDialogResult = dialog.Show();
try
if (TaskDialogResult.CommandLink1 == taskDialogResult)
{
doc.InvokeGroup(tg =>
{
foreach (var ins in distinctInstances)
var instances = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).Cast<FamilyInstance>();
var distinctFamiliesUsed = instances.GroupBy(f => f.Symbol.FamilyName).Select(f => f.FirstOrDefault()).ToList().ConvertAll(f => f.Symbol.Family);
try
{
var famdoc = doc.EditFamily(ins.Symbol.Family);
var formcol = new FilteredElementCollector(famdoc).OfClass(typeof(GenericForm)).Cast<GenericForm>();
var vcol = new FilteredElementCollector(famdoc).OfClass(typeof(Autodesk.Revit.DB.View)).Cast<Autodesk.Revit.DB.View>();
var dimcol = new FilteredElementCollector(famdoc).OfClass(typeof(Autodesk.Revit.DB.Dimension)).Cast<Autodesk.Revit.DB.Dimension>();
var curvecol = new FilteredElementCollector(famdoc).OfClass(typeof(Autodesk.Revit.DB.CurveElement)).Cast<Autodesk.Revit.DB.CurveElement>();
famdoc.Invoke(ts =>
doc.InvokeGroup(tg =>
{
foreach (var view in vcol)
{
var elemidtohide = new List<ElementId>();
foreach (GenericForm form in formcol)
{
if (form.CanBeHidden(view))
{
elemidtohide.Add(form.Id);
}
}
foreach (Dimension dim in dimcol)
{
if (dim.CanBeHidden(view))
{
elemidtohide.Add(dim.Id);
}
}
foreach (CurveElement curve in curvecol)
{
if (curve.CanBeHidden(view))
{
elemidtohide.Add(curve.Id);
}
}
if (elemidtohide.Count > 0)
{
view.HideElements(elemidtohide);
}
}
});
famdoc.LoadFamily(doc, new RsFamilyLoadOption());
famdoc.Close(false);
EncryptOrDecryptFamily encryptFamily = new EncryptOrDecryptFamily(distinctFamiliesUsed);
encryptFamily.IsEncrypt = true;
encryptFamily.ProgressModal();
}, "加密使用族");
}
}, "加密族");
}
catch (Exception ex)
{
if (!(ex is Autodesk.Revit.Exceptions.OperationCanceledException))
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
if (!(ex is Autodesk.Revit.Exceptions.OperationCanceledException))
{
Log.WriteLog(ex.Message);
return Result.Failed;
}
}
}
else if (TaskDialogResult.CommandLink2 == taskDialogResult)
{
var families = new FilteredElementCollector(doc).OfClass(typeof(Family)).Cast<Family>().ToList();
try
{
doc.InvokeGroup(tg =>
{
EncryptOrDecryptFamily encryptFamily = new EncryptOrDecryptFamily(families);
encryptFamily.IsEncrypt = true;
encryptFamily.ProgressModal();
}, "加密所有族");
}
catch (Exception ex)
{
if (!(ex is Autodesk.Revit.Exceptions.OperationCanceledException))
{
Log.WriteLog(ex.Message);
return Result.Failed;
}
}
}
return Result.Succeeded;
}
}

View File

@@ -0,0 +1,191 @@
using Autodesk.Revit.DB;
using RookieStation.CommonTools.Views;
using RookieStation.Extension;
using RookieStation.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RookieStation.CommonTools.ViewModels
{
internal class EncryptOrDecryptFamily
{
public EncryptOrDecryptFamily(List<Family> families)
{
Families = families;
}
public bool IsEncrypt { get; set; }
private ProgressMonitorControl viewmodel { get; set; }
private ProgressMonitorView CurrentUI { get; set; }
private bool Cancel { get; set; }
private List<Family> Families { get; set; }
private delegate void ProgressBarDelegate();
public void ProgressModal()
{
if (Families.Count() == 0)
throw new Exception("当前项目不存在族");
viewmodel = new ProgressMonitorControl();
viewmodel.MaxValue = Families.Count;
viewmodel.ProgressTitle = "族加密";
CurrentUI = new Views.ProgressMonitorView();
CurrentUI.DataContext = viewmodel;
CurrentUI.Closed += CurrentUI_Closed;
CurrentUI.ContentRendered += FireUPModal;
CurrentUI.ShowDialog();
}
private void FireUPModal(object sender, EventArgs e)
{
CurrentUI.ContentRendered -= FireUPModal;
for (int i = 0; i < Families.Count; i++)
{
if (Cancel)
break;
viewmodel.CurrentValue += 1;
viewmodel.CurrentContext = string.Format("总进度{1}/{2}\r\n正在对<{0}>进行处理", Families[i].Name, viewmodel.CurrentValue, viewmodel.MaxValue);
try
{
if (IsEncrypt)
{
HideFamilyElem(Families[i]);
}
else
{
UnHideFamilyElem(Families[i]);
}
}
catch (Exception ex)
{
CloseWindow();
Log.WriteLog(ex.Message);
}
CurrentUI.Dispatcher.Invoke(new ProgressBarDelegate(viewmodel.NotifyUI), System.Windows.Threading.DispatcherPriority.Background);
}
CloseWindow();
}
private void HideFamilyElem(Family family)
{
if (!family.IsEditable)
{
return;
}
var famdoc = family.Document.EditFamily(family);
var formcol = new FilteredElementCollector(famdoc).OfClass(typeof(GenericForm)).Cast<GenericForm>();
var vcol = new FilteredElementCollector(famdoc).OfClass(typeof(Autodesk.Revit.DB.View)).Cast<Autodesk.Revit.DB.View>();
var dimcol = new FilteredElementCollector(famdoc).OfClass(typeof(Autodesk.Revit.DB.Dimension)).Cast<Autodesk.Revit.DB.Dimension>();
var curvecol = new FilteredElementCollector(famdoc).OfClass(typeof(Autodesk.Revit.DB.CurveElement)).Cast<Autodesk.Revit.DB.CurveElement>();
famdoc.Invoke(ts =>
{
foreach (var view in vcol)
{
var elemidtohide = new List<ElementId>();
foreach (GenericForm form in formcol)
{
if (form.CanBeHidden(view))
{
elemidtohide.Add(form.Id);
}
}
foreach (Dimension dim in dimcol)
{
if (dim.CanBeHidden(view))
{
elemidtohide.Add(dim.Id);
}
}
foreach (CurveElement curve in curvecol)
{
if (curve.CanBeHidden(view))
{
elemidtohide.Add(curve.Id);
}
}
if (elemidtohide.Count > 0)
{
view.HideElements(elemidtohide);
}
}
});
famdoc.LoadFamily(family.Document, new RsFamilyLoadOption());
famdoc.Close(false);
}
private void UnHideFamilyElem(Family family)
{
if (!family.IsEditable)
{
return;
}
var famdoc = family.Document.EditFamily(family);
var formcol = new FilteredElementCollector(famdoc).OfClass(typeof(GenericForm)).Cast<GenericForm>();
var vcol = new FilteredElementCollector(famdoc).OfClass(typeof(Autodesk.Revit.DB.View)).Cast<Autodesk.Revit.DB.View>();
var dimcol = new FilteredElementCollector(famdoc).OfClass(typeof(Autodesk.Revit.DB.Dimension)).Cast<Autodesk.Revit.DB.Dimension>();
var curvecol = new FilteredElementCollector(famdoc).OfClass(typeof(Autodesk.Revit.DB.CurveElement)).Cast<Autodesk.Revit.DB.CurveElement>();
famdoc.Invoke(ts =>
{
foreach (var view in vcol)
{
var elemidtounHide = new List<ElementId>();
foreach (GenericForm form in formcol)
{
if (form.IsHidden(view))
{
elemidtounHide.Add(form.Id);
}
}
foreach (Dimension dim in dimcol)
{
if (dim.IsHidden(view))
{
elemidtounHide.Add(dim.Id);
}
}
foreach (CurveElement curve in curvecol)
{
if (curve.IsHidden(view))
{
elemidtounHide.Add(curve.Id);
}
}
if (elemidtounHide.Count > 0)
{
view.UnhideElements(elemidtounHide);
}
}
});
famdoc.LoadFamily(family.Document, new RsFamilyLoadOption());
famdoc.Close(false);
}
private void CloseWindow()
{
CurrentUI.Closed -= CurrentUI_Closed;
CurrentUI.Close();
}
private void CurrentUI_Closed(object sender, EventArgs e)
{
Cancel = true;
}
}
}

View File

@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RookieStation.CommonTools.ViewModels
{
internal class ProgressMonitorControl : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public int MaxValue { get; set; }
public int CurrentValue { get; set; }
public string CurrentContext { get; set; }
public string ProgressTitle { get; set; }
public ProgressMonitorControl()
{
MaxValue = 100;
CurrentValue = 0;
CurrentContext = string.Empty;
}
public void NotifyUI()
{
Type classType = this.GetType();
if (classType != null)
{
System.Reflection.PropertyInfo[] currentProperties = classType.GetProperties();
foreach (System.Reflection.PropertyInfo currentProperty in currentProperties)
OnPropertyChanged(currentProperty.Name);
}
}
private void OnPropertyChanged(string targetProperty)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(targetProperty));
}
}
}

View File

@@ -0,0 +1,42 @@
<Window
x:Class="RookieStation.CommonTools.Views.ProgressMonitorView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:RookieStation.CommonTools.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="{Binding ProgressTitle}"
ResizeMode="NoResize"
SizeToContent="WidthAndHeight"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Window.Resources>
<!--<Style TargetType="Separator">
<Setter Property="Height" Value="5" />
<Setter Property="Background" Value="Transparent" />
</Style>-->
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml" />
<ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<StackPanel Margin="5">
<TextBlock Text="{Binding CurrentContext}" />
<ProgressBar
Width="300"
Height="23"
Maximum="{Binding MaxValue}"
Value="{Binding CurrentValue}" />
<Button
x:Name="btnCancel"
Width="50"
Margin="5"
HorizontalAlignment="Right"
Content="取消"
IsCancel="True" />
</StackPanel>
</Window>

View File

@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace RookieStation.CommonTools.Views
{
/// <summary>
/// Interaction logic for ProgressMonitorView.xaml
/// </summary>
public partial class ProgressMonitorView : Window
{
public ProgressMonitorView()
{
InitializeComponent();
}
}
}

View File

@@ -7,7 +7,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Width="58"
Height="145"
MinWidth="150"
MinWidth="200"
MinHeight="150"
mc:Ignorable="d">
<Window.Resources>

View File

@@ -63,9 +63,9 @@ namespace RookieStation.Properties {
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap AutoShelfLegend {
internal static System.Drawing.Bitmap cainiao {
get {
object obj = ResourceManager.GetObject("AutoShelfLegend", resourceCulture);
object obj = ResourceManager.GetObject("cainiao", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
@@ -73,9 +73,19 @@ namespace RookieStation.Properties {
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap cainiao {
internal static System.Drawing.Bitmap Decrypt {
get {
object obj = ResourceManager.GetObject("cainiao", resourceCulture);
object obj = ResourceManager.GetObject("Decrypt", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap Encrypt {
get {
object obj = ResourceManager.GetObject("Encrypt", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}

View File

@@ -118,12 +118,15 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="AutoShelfLegend" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\AutoShelfLegend.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="cainiao" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\cainiao.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Decrypt" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Decrypt.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Encrypt" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Encrypt.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="EntranceGate" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\entrancegate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

View File

@@ -93,7 +93,13 @@
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="CommonTools\ExecuteCmd\CmdDecryptFamily.cs" />
<Compile Include="CommonTools\ExecuteCmd\CmdEncryptFamily.cs" />
<Compile Include="CommonTools\ViewModels\EncryptOrDecryptFamily.cs" />
<Compile Include="CommonTools\ViewModels\ProgressMonitorControl.cs" />
<Compile Include="CommonTools\Views\ProgressMonitorView.xaml.cs">
<DependentUpon>ProgressMonitorView.xaml</DependentUpon>
</Compile>
<Compile Include="Drawing\ExecuteCmds\CmdAutoCreateLegend.cs" />
<Compile Include="Drawing\ExecuteCmds\CmdBatchExportDwg.cs" />
<Compile Include="Drawing\ExecuteCmds\CmdCreateViewSectionAnnotation.cs" />
@@ -341,6 +347,10 @@
</ItemGroup>
<ItemGroup />
<ItemGroup>
<Page Include="CommonTools\Views\ProgressMonitorView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Drawing\Views\WpfLegendCreator.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@@ -393,6 +403,8 @@
<None Include="Resources\ExportDWG.png" />
<None Include="Resources\AutoShelfLegend.gif" />
<None Include="Resources\Legend.png" />
<None Include="Resources\Decrypt.png" />
<None Include="Resources\Encrypt.png" />
<Content Include="Resources\LogoExtrusion.png" />
<None Include="Resources\ViewPlanDim.png" />
<None Include="Resources\ViewSectionDim.png" />

View File

@@ -98,7 +98,7 @@ namespace RookieStation.RibbonMenu
//统计面板
RibbonPanel statisticsPanel = application.CreateRibbonPanel(TabName, StatisticsPanelName);
CreatePushButton<CmdExportWorkSchedule>(statisticsPanel, "工程量导出", Properties.Resources.WorkSchedule, null);
CreatePushButton<CmdExportBudgetInventory>(statisticsPanel, "工程量导出", Properties.Resources.WorkSchedule, null);
//出图面板
RibbonPanel drawingPanel = application.CreateRibbonPanel(TabName, DrawingPanelName);
CreatePushButton<CmdAutoCreateLegend>(drawingPanel, "货架图例说明", Properties.Resources.Legend, DrawingSheetCmdEnabled);
@@ -110,8 +110,9 @@ namespace RookieStation.RibbonMenu
//通用面板
RibbonPanel commonToolsPanel = application.CreateRibbonPanel(TabName, CommonTools);
CreatePushButton<CmdEncryptFamily>(commonToolsPanel, "加密族", Properties.Resources.Encrypt, null);
CreatePushButton<CmdDecryptFamily>(commonToolsPanel, "解密族", Properties.Resources.Decrypt, null);
CreatePushButton<CmdUseFamilyPane>(commonToolsPanel, "族库浏览", Properties.Resources.FamilyLib, null);
RegisterDockPane(application);
return Result.Succeeded;
}

View File

@@ -33,7 +33,7 @@ namespace RookieStation.ProjectConfig
internal static string DocumentDirectory => AddinDirectory + "\\Document\\";
internal static string LogFolder = AddinDirectory + "\\Log\\";
internal static string DbFolder = AddinDirectory;
internal static string DbFolder = AddinDirectory + "\\";
#endif

View File

@@ -531,6 +531,12 @@
}
"Entry"
{
"MsmKey" = "8:_FD27823B3253486DB7BBB13FEC35052D"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_FBE461B9D4BD4603919E2821D88FB7CB"
"MsmSig" = "8:_UNDEFINED"
@@ -2354,6 +2360,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_FD27823B3253486DB7BBB13FEC35052D"
{
"SourcePath" = "8:..\\RookieStation\\bin\\Release\\x64\\SQLite.Interop.dll"
"TargetName" = "8:SQLite.Interop.dll"
"Tag" = "8:"
"Folder" = "8:_7C1EF99E309C4A3FB02B902F06BE7F60"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
}
"FileType"
{
@@ -2587,7 +2613,7 @@
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:菜鸟驿站工具集"
"ProductCode" = "8:{5DCFF0F8-3C6C-4C34-B888-63FE8034843E}"
"PackageCode" = "8:{125C2C8A-BD7F-42BD-98CF-9784E5BADD7F}"
"PackageCode" = "8:{91ECDA1D-5270-45EF-890D-1889A8B67DC7}"
"UpgradeCode" = "8:{127EC3EC-7539-468B-84EA-E1ECDD6204E6}"
"AspNetVersion" = "8:2.0.50727.0"
"RestartWWWService" = "11:FALSE"