Files
SzmediTools/Szmedi.RvKits/InfoManager/PropEditor/WriteFacilityCodeViewModel.cs

207 lines
8.6 KiB
C#
Raw Normal View History

2025-09-16 16:06:41 +08:00

using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Nice3point.Revit.Toolkit.External.Handlers;
using Szmedi.RvKits.Assists;
namespace Szmedi.RvKits.InfoManager
{
public partial class WriteFacilityCodeViewModel : ObservableObject
{
public WriteFacilityCodeViewModel(UIApplication uiapp)
{
this.uiapp = uiapp;
}
private List<KeyValuePair<string, XYZ>> OriginCodes;
[ObservableProperty]
private List<KeyValuePair<string, XYZ>> codes;
[ObservableProperty]
private KeyValuePair<string, XYZ> selectedCode;
[ObservableProperty]
private string propertyName = "ID-100-编号";
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(WriteCodeCommand))]
private string code;
[ObservableProperty]
private bool isIncrement;
private bool CanWrite => !string.IsNullOrEmpty(Code);
private readonly ActionEventHandler handler = new();
private readonly UIApplication uiapp;
[ObservableProperty]
2025-12-23 21:37:02 +08:00
public partial string SearchText { get; set; }
2025-09-16 16:06:41 +08:00
partial void OnSearchTextChanged(string value)
{
Codes = OriginCodes
.Where(s => string.IsNullOrEmpty(value) || s.Key.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0)
.ToList();
}
partial void OnSelectedCodeChanged(KeyValuePair<string, XYZ> value)
{
Code = value.Key;
BoundingBoxXYZ box = new BoundingBoxXYZ()
{
Max = value.Value.Add(new XYZ(1, 1, 1)),
Min = value.Value.Subtract(new XYZ(1, 1, 1))
};
UIView uiView = uiapp.ActiveUIDocument.GetOpenUIViews().FirstOrDefault(v => v.ViewId == uiapp.ActiveUIDocument.ActiveGraphicalView.Id);
uiView!.ZoomAndCenterRectangle(box.Min, box.Max);
}
[RelayCommand]
private void ReadDwgCodes()
{
handler.Raise(uiapp =>
{
Autodesk.Revit.ApplicationServices.Application application = uiapp.Application;
Autodesk.Revit.UI.UIDocument uiDocument = uiapp.ActiveUIDocument;
Document doc = uiDocument.Document;
Reference textRefer;
try
{
//图层ID
textRefer = uiDocument.Selection.PickObject(
ObjectType.PointOnElement,
new FuncFilter(e => e is ImportInstance import && import.IsLinked && doc.GetElement(e.GetTypeId()) is CADLinkType),
"请选择“链接非导入”的Cad文字图层"
);
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
return;
}
try
{
ImportInstance dwg = doc.GetElement(textRefer) as ImportInstance;
//Transform dwgTransform = dwg!.GetTransform();
string textLayerName = dwg.GetLayerName(textRefer);
//string path = GetDwgPath(dwg);
//using ACadSharp.IO.DwgReader reader = new(path);
//ACadSharp.CadDocument cadDocument = reader.Read();
//var texts = cadDocument.Entities.Where(entity=>entity is MText||entity is TextEntity)
// .Where(e => e.Layer.Name == textLayerName);
//IEnumerable<XYZ> locations = texts.Select(t => dwgTransform.OfPoint(new XYZ(t.InsertPoint.X, t.InsertPoint.Y, t.InsertPoint.Z) / 304.8));
//doc.Invoke(ts =>
//{
// foreach (XYZ loc in locations)
// {
// Plane plane = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, loc);
// SketchPlane sketch = SketchPlane.Create(doc, plane);
// Autodesk.Revit.DB.Arc arc = Autodesk.Revit.DB.Arc.Create(plane, 0.1, 0, Math.PI * 2);
// ModelCurve mc = doc.Create.NewModelCurve(arc, sketch);
// }
//});
//Codes = OriginCodes = cadDocument.Entities
// .Where(entity => ( entity is MText || entity is TextEntity) && entity.Layer.Name == textLayerName)
// .Select(e =>
// {
// if (e is MText mText)
// {
// if (mText.Value.Contains(@"\f") && mText.Value.Contains(@"|b") && mText.Value.Contains(@"i0"))//多行字体编码问题
// {
// return mText.Value.Split(';').Last().TrimEnd('}');
// }
// return mText.Value;
// }
// if (e is TextEntity text)
// {
// return text.Value;
// }
// return null;
// })
// .ToList();
Codes = OriginCodes = dwg.GetTextsByLayer(textLayerName);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
});
}
[RelayCommand(CanExecute = nameof(CanWrite))]
private void WriteCode()
{
handler.Raise(uiapp =>
{
try
{
Element elem;
Autodesk.Revit.UI.UIDocument uidoc = uiapp.ActiveUIDocument;
Document doc = uidoc.Document;
if (uidoc.Selection.GetElementIds().Any())
{
elem = doc.GetElement(uidoc.Selection.GetElementIds().FirstOrDefault());
}
else
{
Reference reference = uidoc.Selection.PickObject(ObjectType.Element, new GenericFilter<FamilyInstance>());
elem = doc.GetElement(reference);
}
if (!elem.IsValidObject)
{
return;
}
doc.Invoke(
_ =>
{
Parameter param = elem.GetParameters(PropertyName).FirstOrDefault();
if (param.IsReadOnly)
{
MessageBox.Show("该属性为只读");
return;
}
var b = param?.Set(Code);
if (b == true && IsIncrement)
{
Regex regex = new Regex(@"(\d+)$");
Match match = regex.Match(Code);
if (match.Success)
{
// 提取匹配的数字部分
string numberPart = match.Groups[1].Value;
// 将数字部分转换为整数并自增
int number = int.Parse(numberPart);
number++;
// 保持原始数字部分的长度
int length = numberPart.Length;
// 将原始字符串的非数字部分与自增后的数字部分拼接
Code = Code.Substring(0, match.Index) + number.ToString().PadLeft(length, '0');
}
}
},
"填写设备编码"
);
//foreach (var elementId in uidoc.Selection.GetElementIds())
//{
// var elem = doc.GetElement(elementId);
// var param = elem.GetParameters("ID-100-编号").FirstOrDefault();
// param?.Set($"{Code}");
//}
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException) { }
});
}
}
}