Files
SzmediTools/Szmedi.RvKits/InfoManager/Delivery/ArchiParamManagerViewModel.cs
2025-09-16 16:06:41 +08:00

171 lines
5.7 KiB
C#

using System.Linq;
using Autodesk.Revit.UI;
using Nice3point.Revit.Toolkit.External.Handlers;
using Szmedi.RvKits.Assists;
using Szmedi.RvKits.InfoManager.Delivery;
using Szmedi.RvKits.Models;
namespace Szmedi.RvKits.InfoManager;
public partial class ArchiParamManagerViewModel : ObservableObject
{
private readonly DapperUtil dapperUtil;
private readonly ActionEventHandler handler;
private readonly UIApplication uiapp;
private readonly List<ParamData> paramsToAdd = new();
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(AddParametersCommand))]
private bool canAdd;
/// <summary>
/// 族参数
/// </summary>
[ObservableProperty]
private bool isFamilyParam;
/// <summary>
/// 族参数(共享参数)
/// </summary>
[ObservableProperty]
private bool isSharedFamilyParam;
/// <summary>
/// 共享参数绑定类别
/// </summary>
[ObservableProperty]
private bool isSharedProjectParam = true;
public List<SharedParameterData> ArchiSharedParams { get; set; }
public List<TreeModel> Models { get; } = new List<TreeModel>();
//public ParamManagerWin ParentWindow { get; set; }
//public ArchiParamManagerViewModel(ParamManagerWin parentWindow)
//{
// ParentWindow = parentWindow;
// dapperUtil = parentWindow.DapperUtil;
// var archiProperties = GetArchiProperties();
// ArchiSharedParams = GetArchiSharedParams();
// GenerateArchiTree(archiProperties);
// CanAdd = paramsToAdd.Any() && !ParentWindow.UiApplication.ActiveUIDocument.Document.IsFamilyDocument;
//}
public ArchiParamManagerViewModel(UIApplication uiapp, DapperUtil dapperUtil, ActionEventHandler handler)
{
this.dapperUtil = dapperUtil;
this.handler = handler;
this.uiapp = uiapp;
var archiProperties = GetArchiProperties();
ArchiSharedParams = GetArchiSharedParams();
GenerateArchiTree(archiProperties);
CanAdd = paramsToAdd.Any() && !uiapp.ActiveUIDocument.Document.IsFamilyDocument;
}
/// <summary>
/// 建筑所有的属性
/// </summary>
private List<ArchiParamData> GetArchiProperties()
{
return dapperUtil.LoadModel<ArchiParamData>("archi_properties");
}
/// <summary>
/// 建筑共享参数
/// </summary>
private List<SharedParameterData> GetArchiSharedParams()
{
return dapperUtil.LoadModel<SharedParameterData>("archi_shared_params");
}
private void GenerateArchiTree(IList<ArchiParamData> paramsData)
{
var majors = paramsData.GroupBy(param => param.Major);
//专业
foreach (var major in majors)
{
List<TreeModel> majorChildren = new();
TreeModel majorTreeModel =
new()
{
Name = major.Key,
Icon = null,
IsChecked = false,
IsExpanded = false,
Children = majorChildren,
Tag = null
};
Models.Add(majorTreeModel);
//构件
var components = major.GroupBy(p => p.Component);
foreach (IGrouping<string, ArchiParamData> component in components)
{
TreeModel componentTreeModel =
new()
{
Id = null,
Name = component.Key,
Icon = null,
IsExpanded = false,
Parent = null,
Children = null,
Tag = component.ToList()
};
majorChildren.Add(componentTreeModel);
}
}
}
[RelayCommand(CanExecute = nameof(CanAdd))]
private void AddParameters()
{
//ExternalEventRequest x = ExternalEventRequest.Denied;
//KeyPressHelpers.SetFocusRVT();
//KeyPressHelpers.keybd_event(0x1B, 0, 0, 0);
//KeyPressHelpers.keybd_event(0x1B, 0, 2, 0);
CommandAssists.ExitCurrentCommand();
handler.Raise(
uiapp =>
{
if (paramsToAdd.Any())
{
var uidoc = uiapp.ActiveUIDocument;
var filePath = Path.Combine(GlobalVariables.DirAssembly, $"TempSharedParameters.txt");
if (IsSharedProjectParam)
{
ParameterHelpers.AddParameterElementsBinding(uidoc, paramsToAdd, ArchiSharedParams, filePath);
}
else
{
ParameterHelpers.AddFamilyParameters(uidoc, paramsToAdd, ArchiSharedParams, IsFamilyParam, filePath);
}
}
});
//ParentWindow.AddParameterEventHandler.IsSharedProjectParam = IsSharedProjectParam;
//ParentWindow.AddParameterEventHandler.IsFamilyParam = IsFamilyParam;
//ParentWindow.AddParameterEventHandler.IsSharedFamilyParam = IsSharedFamilyParam;
//ParentWindow.AddParameterEventHandler.ParametersToAdded = paramsToAdd;
//ParentWindow.AddParameterEventHandler.SharedParameters = ArchiSharedParams;
//ParentWindow.AddParameterEvent.Raise();
//CanAdd = x != ExternalEventRequest.Accepted;
}
[RelayCommand]
private void TreeItemChanged(object obj)
{
if (obj is List<ArchiParamData> paramters)
{
paramsToAdd.Clear();
if (paramters.Any())
{
paramsToAdd.AddRange(paramters.Where(param => param.IsChecked == true));
}
}
CanAdd = paramsToAdd.Any() && !uiapp.ActiveUIDocument.Document.IsFamilyDocument;
}
}