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

365 lines
13 KiB
C#

using System;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Input;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using Nice3point.Revit.Toolkit.External.Handlers;
using Szmedi.RvKits.InfoManager.Delivery;
using Szmedi.RvKits.Models;
namespace Szmedi.RvKits.InfoManager
{
public partial class ParamEditViewModel : ObservableObject
{
[ObservableProperty]
private bool isFamilyParam;
[ObservableProperty]
private bool isSharedFamilyParam;
[ObservableProperty]
private bool isSharedProjectParam = true;
[ObservableProperty]
private List<Element> elementsSelected;
[ObservableProperty]
private List<Parameter> paramNamesSelected;
[ObservableProperty]
private Parameter paramNameSelected;
private readonly UIApplication uiapp;
private readonly ActionEventHandler editHandler;
[RelayCommand]
private void PreviewTextInput(TextCompositionEventArgs args)
{
if (args != null && args.Source is System.Windows.Controls.ComboBox cb)
{
if (cb.Text == cb.SelectedItem?.ToString())
{
args.Handled = true;
}
}
}
/// <summary>
/// 修改标识
/// </summary>
//[RelayCommand]
//[Obsolete]
//private void ApplyIdentification()
//{
// editHandler.Raise(uiapp =>
// {
// var doc = uiapp.ActiveUIDocument.Document;
// var view = doc.ActiveView;
// if (view.ViewType == ViewType.ThreeD)
// {
// FilteredElementCollector collector = new(doc, view.Id);
// foreach (var elem in collector)
// {
// switch (elem)
// {
// case Wall wall:
// break;
// case Floor floor:
// break;
// }
// }
// }
// });
//}
//[RelayCommand]
//private void ApplyBelongFloor()
//{
// editHandler.Raise(uiapp =>
// {
// doc doc = uiapp.ActiveUIDocument.doc;
// });
//}
public List<TreeModel> Models { get; } = new();
public ParamEditViewModel(UIApplication uiapp, ActionEventHandler editHandler)
{
this.uiapp = uiapp;
this.editHandler = editHandler;
}
//[Obsolete]
//private void GenerateArchiTree(IList<ParamData> 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 (var 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);
// }
// }
//}
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(AddParameterCommand))]
private string paramName;
private bool CanAddParams()
{
return !string.IsNullOrEmpty(ParamName) && !string.IsNullOrWhiteSpace(ParamName);
}
[RelayCommand(CanExecute = nameof(CanAddParams))]
private void AddParameter()
{
//KeyPressAssists.SetFocusRVT();
//KeyPressAssists.keybd_event(0x1B, 0, 0, 0);
//KeyPressAssists.keybd_event(0x1B, 0, 2, 0);
if (!string.IsNullOrEmpty(ParamName))
{
CustomParamData pd =
new()
{
Guid = Guid.NewGuid().ToString(),
Property = ParamName,
Unit = "/"
};
editHandler.Raise(
uiapp =>
{
var uidoc = uiapp.ActiveUIDocument;
var filePath = Path.Combine(GlobalVariables.DirAssembly, $"TempSharedParameters.txt");
if (IsSharedProjectParam)
{
ParameterHelpers.AddParamBinding(uidoc, pd, filePath);
}
else
{
ParameterHelpers.AddFamilyParam(uidoc, pd, IsFamilyParam, filePath);
}
});
}
}
[RelayCommand]
private void ModifyParameter(object obj)
{
editHandler.Raise(
uiapp =>
{
var value = obj.ToString();
var uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
using Transaction trans = new(doc, "修改参数值");
StringBuilder sb = new();
trans.Start();
foreach (var elem in ElementsSelected)
{
//先获取实例参数
var param = elem.GetParameters(ParamNameSelected.Definition.Name).FirstOrDefault();
//在获取类型参数
if (param == null)
{
var symbolOrType = doc.GetElement(elem.GetTypeId());
param = symbolOrType.GetParameters(ParamNameSelected.Definition.Name).FirstOrDefault();
}
try
{
if (param != null)
{
switch (param.StorageType)
{
case StorageType.None:
break;
case StorageType.Integer:
param.Set(Convert.ToInt16(value));
break;
case StorageType.Double:
param.Set(Convert.ToDouble(value));
break;
case StorageType.String:
param.Set(value);
break;
case StorageType.ElementId:
param.Set(new ElementId(Convert.ToInt16(value)));
break;
}
}
}
catch (Exception e)
{
if (!sb.ToString().Contains(e.Message))
{
sb.AppendLine(e.Message);
}
}
}
trans.Commit();
if (!string.IsNullOrEmpty(sb.ToString()))
{
MessageBox.Show(sb.ToString(), "错误");
}
else
{
MessageBox.Show("修改完成!", "提示");
}
});
//ParentWindow.ModifyElementsParamEventHandler.value = obj.ToString();
//ParentWindow.ModifyElementsParamEventHandler.ParameterSelected = ParamNameSelected;
//ParentWindow.ModifyElementsParamEventHandler.ElementsSelected = ElementsSelected;
//ParentWindow.ModifyElementsParamEvent.Raise();
}
[RelayCommand]
private void SelectElements()
{
//KeyPressAssists.SetFocusRVT();
//KeyPressAssists.keybd_event(0x1B, 0, 0, 0);
//KeyPressAssists.keybd_event(0x1B, 0, 2, 0);
var uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
if (uidoc.Selection.GetElementIds().Count == 0)
{
var instancesSelected = uidoc.Selection.PickElementsByRectangle(
new TypesSelectionFilter(typeof(FamilyInstance), typeof(HostObject), typeof(Railing)),
"请框选元素"
);
ElementsSelected = instancesSelected.ToList();
}
else
{
var instancesSelected = from id in uidoc.Selection.GetElementIds() select doc.GetElement(id);
ElementsSelected = instancesSelected.ToList();
}
List<Parameter> parameters = new();
var element = ElementsSelected.FirstOrDefault(element => element.GetTypeId() != ElementId.InvalidElementId);
var firstParameterSet = element.ParametersMap;
var firstTypeOrSymbol = doc.GetElement(element.GetTypeId());
var firstTypeParameterSet = firstTypeOrSymbol.ParametersMap;
foreach (Parameter param in firstParameterSet)
{
if (param.IsReadOnly)
{
continue;
}
parameters.Add(param);
}
foreach (Parameter param in firstTypeParameterSet)
{
if (param.IsReadOnly)
{
continue;
}
parameters.Add(param);
}
foreach (var elem in ElementsSelected)
{
var instanceParameterSet = elem.ParametersMap;
if (elem.GetTypeId() == ElementId.InvalidElementId)
{
continue;
}
var typeOrSymbol = doc.GetElement(elem.GetTypeId());
var typeParameterSet = typeOrSymbol.ParametersMap;
for (var i = parameters.Count - 1; i >= 0; i--)
{
var parameter = parameters[i];
var isExist = false;
foreach (Parameter param in instanceParameterSet)
{
if (param.IsReadOnly)
{
continue;
}
if (
parameter.Definition.Name == param.Definition.Name
&& (
param.StorageType == StorageType.String
|| param.StorageType == StorageType.Integer
|| param.StorageType == StorageType.Double
)
)
{
isExist = true;
break;
}
}
foreach (Parameter param in typeParameterSet)
{
if (param.IsReadOnly)
{
continue;
}
if (
parameter.Definition.Name == param.Definition.Name
&& (
param.StorageType == StorageType.String
|| param.StorageType == StorageType.Integer
|| param.StorageType == StorageType.Double
)
)
{
isExist = true;
break;
}
}
if (isExist == false)
{
parameters.Remove(parameter);
}
}
}
ParamNamesSelected = parameters.OrderBy(p => p.Definition.Name).ToList();
}
}
}