Files
ShrlAlgoToolkit/ShrlAlgoToolkit.RevitAddins/RvMEP/RotateMEPViewModel.cs
2025-10-04 08:52:23 +08:00

104 lines
4.0 KiB
C#

using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Nice3point.Revit.Toolkit.External.Handlers;
namespace ShrlAlgoToolkit.RevitAddins.RvMEP
{
public partial class RotateMEPViewModel : ObservableObject
{
[ObservableProperty]
public partial double Angle { get; set; } = 90;
[ObservableProperty]
public partial bool IsSingleSelect { get; set; } = true;
[RelayCommand]
private void RotateInstance()
{
rotateHandler.Raise(
uiapp =>
{
var uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
ICollection<ElementId> elemIds = [];
if (uidoc.Selection.GetElementIds().Any())
{
elemIds = uidoc.Selection.GetElementIds();
}
else
{
if (IsSingleSelect)
{
var r = uidoc.Selection.PickObject(ObjectType.Element, new FuncFilter(e =>
{
return e is FamilyInstance && e.GetConnectors().OfType<Connector>().Any(c => c.IsConnected);
}), "请选择已经连管的构件");
elemIds.Add(r.ElementId);
}
else
{
elemIds = uidoc.Selection.PickObjects(ObjectType.Element, new FuncFilter(e =>
{
return e is FamilyInstance && e.GetConnectors().OfType<Connector>().Any(c => c.IsConnected);
}), "请选择已经连管的构件,并完成").Select(r => doc.GetElement(r).Id).ToList();
}
}
foreach (var id in elemIds)
{
var elem = uidoc.Document.GetElement(id);
var referConn = elem.GetConnectors().OfType<Connector>().FirstOrDefault(c =>
{
if (c.IsConnected)
{
if (c.CoordinateSystem.BasisZ.X > 0)
{
return true;
}
else
{
if (c.CoordinateSystem.BasisZ.Y > 0)
{
return true;
}
else
{
if (c.CoordinateSystem.BasisZ.Z > 0)
{
return true;
}
}
}
}
return false;
});
if (referConn != null)
{
doc.Invoke(
_ =>
{
ElementTransformUtils.RotateElement(
doc,
elem.Id,
Line.CreateUnbound(
referConn.CoordinateSystem.Origin,
referConn.CoordinateSystem.BasisZ),
Angle.ToRadian());
}, "旋转实例");
}
}
});
}
readonly ActionEventHandler rotateHandler = new();
}
}