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
|
|
|
|
namespace ShrlAlgoToolkit.RevitAddins.Mep
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
|
|
|
|
|
public partial class RotateMEPViewModel : ObservableObject
|
|
|
|
|
|
{
|
|
|
|
|
|
[ObservableProperty]
|
2025-10-04 08:52:23 +08:00
|
|
|
|
public partial double Angle { get; set; } = 90;
|
|
|
|
|
|
|
2024-09-22 11:05:41 +08:00
|
|
|
|
[ObservableProperty]
|
2025-10-04 08:52:23 +08:00
|
|
|
|
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(
|
2025-10-04 08:52:23 +08:00
|
|
|
|
_ =>
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|