222 lines
9.2 KiB
C#
222 lines
9.2 KiB
C#
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Windows;
|
||
|
||
using Autodesk.Revit.DB;
|
||
|
||
using EPPlus.Core.Extensions;
|
||
|
||
using Microsoft.Win32;
|
||
|
||
using Nice3point.Revit.Toolkit.External.Handlers;
|
||
|
||
using OfficeOpenXml;
|
||
|
||
namespace Szmedi.RvKits.ModelManager
|
||
{
|
||
public partial class MappingElementCodeViewModel : ObservableObject
|
||
{
|
||
private readonly ActionEventHandler handler = new();
|
||
|
||
[ObservableProperty]
|
||
private string excelPath;
|
||
|
||
[ObservableProperty]
|
||
private ExcelWorksheet selectedSheet;
|
||
|
||
[ObservableProperty]
|
||
private bool isFuzzyMatch = true;
|
||
[ObservableProperty]
|
||
private bool isIdMapping;
|
||
/// <summary>
|
||
/// 选择的列
|
||
/// </summary>
|
||
[ObservableProperty]
|
||
private KeyValuePair<int, string> selectedColumn;
|
||
|
||
[ObservableProperty]
|
||
private ExcelWorksheets sheets;
|
||
|
||
/// <summary>
|
||
/// 第一行,表头的数据
|
||
/// </summary>
|
||
[ObservableProperty]
|
||
private IEnumerable<KeyValuePair<int, string>> columns;
|
||
private ExcelPackage excelPackage;
|
||
|
||
[RelayCommand]
|
||
private void WriteParameters()
|
||
{
|
||
handler.Raise(uiapp =>
|
||
{
|
||
var sb = new StringBuilder();
|
||
var doc = uiapp.ActiveUIDocument.Document;
|
||
//匹配的元素在第几列
|
||
var col = SelectedColumn.Key;
|
||
//匹配的属性条目名称
|
||
var paramNameMapped = SelectedColumn.Value;
|
||
doc.InvokeGroup(
|
||
_ =>
|
||
{
|
||
//从第二行开始
|
||
for (int m = SelectedSheet.Dimension.Start.Row + 1, n = SelectedSheet.Dimension.End.Row; m <= n; m++)
|
||
{
|
||
//找到值
|
||
var val = SelectedSheet.GetValue(m, col);
|
||
|
||
Element elementMapped = null;
|
||
var excelValue = val.ToString();
|
||
|
||
if (paramNameMapped.ToUpper() == "ID")
|
||
{
|
||
if (IsFuzzyMatch)
|
||
{
|
||
excelValue = excelValue.Trim().ToLower();
|
||
}
|
||
var id = Convert.ToInt32(excelValue);
|
||
elementMapped = doc.GetElement(new ElementId(id));
|
||
if (elementMapped != null)
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
elementMapped = doc.OfAllModelCollector()?.WhereElementIsNotElementType().FirstOrDefault(
|
||
e =>
|
||
{
|
||
if (e.GetParameters(paramNameMapped).Count == 0)
|
||
{
|
||
return false;
|
||
}
|
||
return e.GetParameters(paramNameMapped).Any(p =>
|
||
{
|
||
var paramValue = p.GetValue().ToString();
|
||
if (IsFuzzyMatch)
|
||
{
|
||
paramValue = paramValue.Trim().ToLower();
|
||
excelValue = excelValue.Trim().ToLower();
|
||
}
|
||
return paramValue == excelValue;
|
||
});
|
||
|
||
});
|
||
|
||
}
|
||
|
||
if (elementMapped == null)
|
||
{
|
||
sb.AppendLine(
|
||
$"工作簿:《{Path.GetFileNameWithoutExtension(ExcelPath)}》 表:<{SelectedSheet.Name}> 行号: {m} 未发现匹配的模型。");
|
||
continue;
|
||
}
|
||
//不存在的属性
|
||
var noExistProps = Columns.Where(
|
||
item => elementMapped.GetParameters(item.Value).Count == 0
|
||
&& item.Value.ToUpper() != "ID");
|
||
|
||
if (noExistProps.Any())
|
||
{
|
||
if (elementMapped is FamilyInstance instance)
|
||
{
|
||
if (!instance.Symbol.Family.IsEditable)
|
||
{
|
||
sb.AppendLine($"族不可编辑:Id:{instance.Id}-类型名:{instance.Symbol.FamilyName}");
|
||
continue;
|
||
}
|
||
var famdoc = doc.EditFamily(instance.Symbol.Family);
|
||
|
||
famdoc.Invoke(
|
||
ts =>
|
||
{
|
||
foreach (var item in noExistProps)
|
||
{
|
||
famdoc.FamilyManager
|
||
.AddParameter(
|
||
item.Value,
|
||
BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES,
|
||
ParameterType.Text,
|
||
true);
|
||
}
|
||
},
|
||
"添加缺失的族参数属性条目");
|
||
famdoc.LoadFamily(doc, new FamilyLoadOption());
|
||
famdoc.Close(false);
|
||
}
|
||
else
|
||
{
|
||
doc.Invoke(ts =>
|
||
{
|
||
foreach (var item in noExistProps)
|
||
{
|
||
SharedParameterAssists.AddOrAttachSharedParameter(doc, item.Value, categories: elementMapped.Category);
|
||
}
|
||
}, "添加缺失的共享参数属性条目");
|
||
}
|
||
}
|
||
doc.Invoke(ts =>
|
||
{
|
||
foreach (var item in Columns)
|
||
{
|
||
var paramsToWrite = elementMapped.GetParameters(item.Value);
|
||
|
||
var v = SelectedSheet.GetValue(m, item.Key);
|
||
//if(paramToWrite == null)
|
||
//{
|
||
// //sb.AppendLine($"元素Id:[{elementMaped.Id}] 元素:{elementMaped.Name} 属性: {item.Value} 未发现。");
|
||
// continue;
|
||
//}
|
||
foreach (var param in paramsToWrite)
|
||
{
|
||
param?.SetValue(v);
|
||
}
|
||
}
|
||
},
|
||
"属性填写");
|
||
}
|
||
}, "属性匹配");
|
||
if (sb.Length > 0)
|
||
{
|
||
MessageBox.Show(sb.ToString(), "处理结果");
|
||
}
|
||
//LogAssists.WriteTxtFile("log", sb.ToString());
|
||
});
|
||
|
||
}
|
||
|
||
partial void OnSelectedSheetChanged(ExcelWorksheet value)
|
||
{
|
||
//第一行的所有列
|
||
Columns = value.GetColumns(1).Where(r => !string.IsNullOrEmpty(r.Value));
|
||
}
|
||
|
||
[RelayCommand]
|
||
private void OnDrop(DragEventArgs e)
|
||
{
|
||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||
{
|
||
var files = (string[])e.Data.GetData(DataFormats.FileDrop);
|
||
if (files is { Length: > 0 })
|
||
{
|
||
ExcelPath = files[0]; // 读取文件路径并赋值给 FilePath 属性
|
||
}
|
||
}
|
||
}
|
||
|
||
[RelayCommand]
|
||
private void SelectExcelPath()
|
||
{
|
||
var dialog = new OpenFileDialog()
|
||
{
|
||
Filter = "Excel文件(*.xlsx)|*.xlsx",
|
||
Title = "请选择Excel文件",
|
||
};
|
||
if (dialog.ShowDialog() == true)
|
||
{
|
||
ExcelPath = dialog.FileName;
|
||
excelPackage = new(new System.IO.FileInfo(dialog.FileName));
|
||
Sheets = excelPackage.Workbook.Worksheets;
|
||
}
|
||
}
|
||
}
|
||
}
|