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] private double angle = 90; [ObservableProperty] private bool isSingleSelect = true; [RelayCommand] private void RotateInstance() { rotateHandler.Raise( uiapp => { var uidoc = uiapp.ActiveUIDocument; var doc = uidoc.Document; ICollection 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().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().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().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( ts => { ElementTransformUtils.RotateElement( doc, elem.Id, Line.CreateUnbound( referConn.CoordinateSystem.Origin, referConn.CoordinateSystem.BasisZ), Angle.ToRadian()); }, "旋转实例"); } } }); } readonly ActionEventHandler rotateHandler = new(); } }