Files
ShrlAlgoToolkit/ShrlAlgoToolkit.RevitAddins/Mep/RotateMEPViewModel.cs

106 lines
4.1 KiB
C#
Raw Normal View History

2025-04-24 20:56:44 +08:00
using Autodesk.Revit.DB;
2024-09-22 11:05:41 +08:00
using Autodesk.Revit.UI.Selection;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Nice3point.Revit.Toolkit.External.Handlers;
2026-02-22 20:03:42 +08:00
using ShrlAlgoToolkit.RevitAddins.RvMEP;
using ShrlAlgoToolkit;
using ShrlAlgoToolkit.RevitAddins;
2024-09-22 11:05:41 +08:00
2026-02-22 20:03:42 +08:00
namespace ShrlAlgoToolkit.RevitAddins.Mep
2024-09-22 11:05:41 +08:00
{
public partial class RotateMEPViewModel : ObservableObject
{
[ObservableProperty]
public partial double Angle { get; set; } = 90;
2024-09-22 11:05:41 +08:00
[ObservableProperty]
public partial bool IsSingleSelect { get; set; } = true;
2024-09-22 11:05:41 +08:00
[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);
2024-10-08 16:21:39 +08:00
}), "请选择已经连管的构件");
2024-09-22 11:05:41 +08:00
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);
2024-10-08 16:21:39 +08:00
}), "请选择已经连管的构件,并完成").Select(r => doc.GetElement(r).Id).ToList();
2024-09-22 11:05:41 +08:00
}
}
2024-10-08 16:21:39 +08:00
foreach (var id in elemIds)
2024-09-22 11:05:41 +08:00
{
var elem = uidoc.Document.GetElement(id);
2024-10-08 16:21:39 +08:00
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;
});
2024-09-22 11:05:41 +08:00
if (referConn != null)
{
doc.Invoke(
_ =>
2024-09-22 11:05:41 +08:00
{
ElementTransformUtils.RotateElement(
doc,
elem.Id,
Line.CreateUnbound(
referConn.CoordinateSystem.Origin,
referConn.CoordinateSystem.BasisZ),
Angle.ToRadian());
2024-10-08 16:21:39 +08:00
}, "旋转实例");
2024-09-22 11:05:41 +08:00
}
}
});
}
readonly ActionEventHandler rotateHandler = new();
}
}