日常更新

This commit is contained in:
ShrlAlgo
2026-01-16 17:07:43 +08:00
parent b611efeed9
commit 3650f8550e
74 changed files with 2040 additions and 2151 deletions

View File

@@ -14,6 +14,9 @@ namespace Szmedi.RvKits.MEPTools
{
public override void Execute()
{
#if DEBUG
GlobalVariables.UIApplication=this.UiApplication;
#endif
WinDialogAssists.ShowOrActivate<FacilityInfoProcessView, FacilityInfoProcessViewModel>();
}
}

View File

@@ -9,8 +9,8 @@
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="设备信息"
Width="800"
Height="450"
Width="900"
Height="600"
d:DataContext="{d:DesignInstance Type=local:FacilityInfoProcessViewModel}"
mc:Ignorable="d">
<controls:MaterialWindow.Resources>
@@ -34,13 +34,15 @@
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MinWidth="200" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="300" MinWidth="100" />
<ColumnDefinition Width="250" MinWidth="100" />
</Grid.ColumnDefinitions>
<GroupBox Header="设备表">
<GroupBox materialDesign:GroupBoxAssist.HeaderPadding="4" Header="设备表">
<DataGrid
x:Name="Facilities"
Margin="-4"
d:ItemsSource="{d:SampleData ItemCount=5}"
materialDesign:DataGridAssist.CellPadding="8,0"
materialDesign:DataGridAssist.ColumnHeaderPadding="6"
AutoGenerateColumns="False"
CanUserAddRows="False"
FrozenColumnCount="2"
@@ -59,24 +61,19 @@
</Style>
</DataGrid.RowStyle>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<GroupBox Header="参数列表">
<ItemsControl ItemsSource="{Binding Parameters}">
<DataTemplate DataType="local:FacilityItem">
<GroupBox materialDesign:GroupBoxAssist.HeaderPadding="4" Header="参数列表">
<ItemsControl d:ItemsSource="{d:SampleData ItemCount=5}" ItemsSource="{Binding Parameters}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="2" Orientation="Horizontal">
<TextBlock
Width="250"
HorizontalAlignment="Right"
VerticalAlignment="Center"
FontWeight="Bold"
Text="{Binding Name}" />
<TextBox
Padding="3"
VerticalContentAlignment="Center"
materialDesign:HintAssist.IsFloating="False"
Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
<DataTemplate DataType="local:ParameterItem">
<TextBox
Padding="2"
HorizontalAlignment="Left"
VerticalContentAlignment="Center"
materialDesign:HintAssist.IsFloating="False"
materialDesign:TextFieldAssist.PrefixText="{Binding Name, StringFormat={}{0}}"
Style="{StaticResource MaterialDesignTextBox}"
Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
@@ -87,9 +84,10 @@
<DataGridCheckBoxColumn Binding="{Binding IsSelected}">
<DataGridCheckBoxColumn.Header>
<Border Background="Transparent">
<CheckBox Content="全选" IsChecked="{Binding DataContext.IsAllItemsSelected, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</Border>
<CheckBox
VerticalContentAlignment="Center"
Content="全选"
IsChecked="{Binding DataContext.IsAllItemsSelected, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</DataGridCheckBoxColumn.Header>
<DataGridCheckBoxColumn.HeaderStyle>
<Style BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}" TargetType="{x:Type DataGridColumnHeader}">
@@ -224,6 +222,7 @@
<GroupBox
Grid.Row="0"
Grid.Column="2"
materialDesign:GroupBoxAssist.HeaderPadding="4"
Header="构件实例表">
<Grid>
<Grid.RowDefinitions>
@@ -234,6 +233,8 @@
x:Name="InstancesDG"
Margin="-4"
d:ItemsSource="{d:SampleData ItemCount=5}"
materialDesign:DataGridAssist.CellPadding="8,0"
materialDesign:DataGridAssist.ColumnHeaderPadding="6"
AutoGenerateColumns="False"
CanUserAddRows="False"
ItemsSource="{Binding ElementName=Facilities, Path=SelectedItem.Instances}"
@@ -310,7 +311,6 @@
</Button>
<GridSplitter Width="2" Background="Gray" />
<Button
Grid.Row="1"
Margin="2,0"
Command="{Binding RepickInstancesByRectangleCommand}"
CommandParameter="{Binding SelectedFacility.MappedFamily}"

View File

@@ -51,7 +51,7 @@ namespace Szmedi.RvKits.MEPTools
public ICollectionView InstancesCollectionView { get; set; }
public FacilityInfoProcessViewModel()
{
GlobalVariables.UIApplication.ViewActivated += UIApplication_ViewActivated;
GlobalVariables.UIApplication?.ViewActivated += UIApplication_ViewActivated;
handler = new ActionEventHandler();
}
[RelayCommand]
@@ -63,12 +63,11 @@ namespace Szmedi.RvKits.MEPTools
AppDomain.CurrentDomain.AssemblyResolve += ResolveHelper.ResolveAssembly;
try
{
Items = package.ToList<FacilityItem>(1, configuration => configuration.SkipCastingErrors());
}
catch (EPPlus.Core.Extensions.Exceptions.ExcelValidationException)
catch (EPPlus.Core.Extensions.Exceptions.ExcelValidationException ex)
{
MessageBox.Show("列名不存在或不匹配,请检查表头是否存在换行或多余文字。");
MessageBox.Show("列名不存在或不匹配,请检查表头是否存在换行或多余文字。", ex.Message);
}
catch (Exception ex)
{
@@ -128,16 +127,14 @@ namespace Szmedi.RvKits.MEPTools
{
// 获取类型元素 (FamilySymbol)
Element typeElem = doc.GetElement(typeId);
FamilySymbol symbol = typeElem as FamilySymbol;
if (symbol != null)
if (typeElem is FamilySymbol symbol)
{
Family family = symbol.Family;
// 确保族存在且未被添加过
if (family != null && !usedFamilyIds.Contains(family.Id))
if (family != null && usedFamilyIds.Add(family.Id))
{
usedFamilyIds.Add(family.Id);
resultFamilies.Add(family);
}
}
@@ -153,7 +150,6 @@ namespace Szmedi.RvKits.MEPTools
return;
}
var families = GetUsedFamilies(doc)
.Cast<Family>()
.Where(
fam => fam.FamilyCategory.AllowsBoundParameters &&
fam.IsEditable &&
@@ -180,6 +176,10 @@ namespace Szmedi.RvKits.MEPTools
GetFamilies();
ExcelPath = ofd.FileName;
ProcessExcel(ofd.FileName);
if (Items == null)
{
return;
}
FuzzyMatch();
FacilitiesCollectionView = CollectionViewSource.GetDefaultView(Items);
@@ -206,7 +206,6 @@ namespace Szmedi.RvKits.MEPTools
}
foreach (var item in Items)
{
string resultName = string.Empty;
double minRatio = 30;
foreach (var family in Families)
@@ -354,126 +353,120 @@ namespace Szmedi.RvKits.MEPTools
MessageBox.Show("未选择任何有效的设备项进行处理。", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
try
{
handler.Raise(
uiapp =>
handler.Raise(
uiapp =>
{
var doc = uiapp.ActiveUIDocument.Document;
if (doc.IsFamilyDocument)
{
var doc = uiapp.ActiveUIDocument.Document;
if (doc.IsFamilyDocument)
return;
}
doc.InvokeGroup(
_ =>
{
return;
}
doc.InvokeGroup(
ts =>
StringBuilder sb = new StringBuilder();
var allInstances = Items.Where(i => i.IsSelected).SelectMany(i => i.Instances).ToList();
string message = ValidateDuplicatesWithDisplay(allInstances, s => s.Id, s => $"{s.Symbol.FamilyName}:{s.Name}");
if (!string.IsNullOrEmpty(message))
{
StringBuilder sb = new StringBuilder();
var allInstances = Items.Where(i => i.IsSelected).SelectMany(i => i.Instances).ToList();
string message = ValidateDuplicatesWithDisplay(allInstances, s => s.Id, s => $"{s.Symbol.FamilyName}:{s.Name}");
if (!string.IsNullOrEmpty(message))
MessageBox.Show(message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
foreach (var item in processItems)
{
var family = item.MappedFamily;
if (!family.IsValidObject)
{
MessageBox.Show(message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
return;
sb.AppendLine($"<{item.Name}>因文档手动修改导致匹配族失效,请重新匹配,跳过该族。");
continue;
}
foreach (var item in processItems)
if (!family.IsEditable)
{
var family = item.MappedFamily;
if (!family.IsEditable)
{
sb.AppendLine($"{family.Name} 族不可编辑,跳过该族。");
}
Document famdoc = null;
try
{
famdoc = doc.EditFamily(family);
famdoc.Invoke(
ts =>
{
foreach (var paramItem in item.Parameters)
{
try
{
var familyParameters = famdoc.FamilyManager.GetParameters().Where(p => p.Definition.Name == paramItem.Name);
if (familyParameters.Any())
{
var parameter = familyParameters.FirstOrDefault();
if (parameter.Definition is InternalDefinition def && def.BuiltInParameter == BuiltInParameter.INVALID)
{
famdoc.FamilyManager.RemoveParameter(parameter);
famdoc.Regenerate();
}
famdoc.FamilyManager.AddParameter(paramItem.Name, BuiltInParameterGroup.PG_TEXT, ParameterType.Text, true);
}
else
{
famdoc.FamilyManager
.AddParameter(
paramItem.Name,
BuiltInParameterGroup.PG_TEXT,
ParameterType.Text,
true);
}
}
catch (Exception ex)
{
sb.AppendLine($"{family.Name} 族参数 {paramItem.Name} 添加失败,{ex.Message}");
}
}
},
"添加缺失的族参数属性条目");
var loadedFamily = famdoc.LoadFamily(doc, new FamilyLoadOption());
}
catch (Exception ex)
{
sb.AppendLine($"{family.Name} 族加载到项目中失败,原因:{ex.Message}");
}
finally
{
famdoc?.Close(false);
}
doc.Invoke(
ts =>
sb.AppendLine($"{family.Name} 族不可编辑,跳过该族。");
continue;
}
Document famdoc = null;
try
{
famdoc = doc.EditFamily(family);
famdoc.Invoke(
_ =>
{
foreach (var instance in item.Instances)
foreach (var paramItem in item.Parameters)
{
foreach (var paramItem in item.Parameters)
try
{
Parameter param = instance.GetParameters(paramItem.Name)?.FirstOrDefault();
if (param != null && !param.IsReadOnly)
var familyParameters = famdoc.FamilyManager.GetParameters()
.Where(p => p.Definition.Name == paramItem.Name).ToList();
if (familyParameters.Count > 0)
{
param.Set(paramItem.Value);
var parameter = familyParameters.FirstOrDefault();
if (parameter.Definition is InternalDefinition def && def.BuiltInParameter == BuiltInParameter.INVALID)
{
famdoc.FamilyManager.RemoveParameter(parameter);
famdoc.Regenerate();
}
famdoc.FamilyManager.AddParameter(paramItem.Name, BuiltInParameterGroup.PG_TEXT, ParameterType.Text, true);
}
else
{
sb.AppendLine($"{instance.Id} - {instance.Name} 未找到参数 {paramItem.Name} 或参数只读,未设置其值。");
famdoc.FamilyManager
.AddParameter(
paramItem.Name,
BuiltInParameterGroup.PG_TEXT,
ParameterType.Text,
true);
}
}
catch (Exception ex)
{
sb.AppendLine($"{family.Name} 族参数 {paramItem.Name} 添加失败,{ex.Message}");
}
}
});
}
if (sb.Length > 0)
{
MessageBox.Show(sb.ToString());
}
else
{
MessageBox.Show("添加完成!");
}
});
});
}
catch (Exception)
{
},
"添加缺失的族参数属性条目");
throw;
}
item.MappedFamily = famdoc.LoadFamily(doc, new FamilyLoadOption());
}
catch (Exception ex)
{
sb.AppendLine($"{family.Name} 族加载到项目中失败,原因:{ex.Message}");
}
finally
{
famdoc?.Close(false);
}
doc.Invoke(
ts =>
{
foreach (var instance in item.Instances)
{
foreach (var paramItem in item.Parameters)
{
Parameter param = instance.GetParameters(paramItem.Name)?.FirstOrDefault();
if (param is { IsReadOnly: false })
{
param.Set(paramItem.Value);
}
else
{
sb.AppendLine($"{instance.Id} - {instance.Name} 未找到参数 {paramItem.Name} 或参数只读,未设置其值。");
}
}
}
});
}
MessageBox.Show(sb.Length > 0 ? sb.ToString() : "添加完成!");
}, "处理设备信息");
});
}
[ObservableProperty]
public partial FacilityItem SelectedFacility { get; set; }
@@ -645,7 +638,9 @@ namespace Szmedi.RvKits.MEPTools
[ObservableProperty]
public partial string Value { get; set; }
}
/// <summary>
/// Excel表里的设备项
/// </summary>
public partial class FacilityItem : ObservableObject
{
public FacilityItem()