功能更新
This commit is contained in:
@@ -114,7 +114,7 @@ public static class ConnectorExtensions
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 分支连接
|
||||
/// </summary>
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.DB.Architecture;
|
||||
using Autodesk.Revit.DB.Structure;
|
||||
|
||||
namespace ShrlAlgoToolkit.RevitCore.Extensions;
|
||||
|
||||
@@ -41,6 +43,251 @@ public static class ElementExtensions
|
||||
ElementTransformUtils.MoveElement(element.Document, element.Id, vector);
|
||||
return element;
|
||||
}
|
||||
public static void MoveElement(this Element item, XYZ vector)
|
||||
{
|
||||
if (item.Pinned || !item.IsValidObject || item == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var doc = item.Document;
|
||||
var levels = doc.OfClass<Level>().OfType<Level>().OrderBy(l => l.Elevation).ToList();
|
||||
if (item is FamilyInstance instance)
|
||||
{
|
||||
var baseElev = instance.get_BoundingBox(null).Min.Z + vector.Z;
|
||||
var topElev = instance.get_BoundingBox(null).Max.Z + vector.Z;
|
||||
var baseLevel = GetClosetLevel(levels, baseElev);
|
||||
var topLevel = GetClosetLevel(levels, topElev);
|
||||
|
||||
switch (instance.Symbol.Family.FamilyPlacementType)
|
||||
{
|
||||
//柱
|
||||
case FamilyPlacementType.TwoLevelsBased:
|
||||
{
|
||||
instance.Location.Move(vector);
|
||||
|
||||
instance.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_PARAM).Set(baseLevel.Id);
|
||||
instance.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM).Set(baseElev - baseLevel.Elevation);
|
||||
|
||||
instance.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_PARAM).Set(topLevel.Id);
|
||||
instance.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM).Set(topElev - topLevel.Elevation);
|
||||
}
|
||||
break;
|
||||
case FamilyPlacementType.ViewBased:
|
||||
break;
|
||||
case FamilyPlacementType.WorkPlaneBased:
|
||||
{
|
||||
//instance.Location.Move(vector);
|
||||
var param = instance.get_Parameter(BuiltInParameter.INSTANCE_ELEVATION_PARAM);
|
||||
if (param != null && !param.IsReadOnly)
|
||||
{
|
||||
ElementTransformUtils.MoveElement(doc, instance.Id, XYZ.BasisZ * vector.Z);
|
||||
|
||||
//var value = param.AsDouble() + vector.Z;
|
||||
//param.Set(value);
|
||||
}
|
||||
|
||||
doc.Regenerate();
|
||||
|
||||
if (instance.Host == null)
|
||||
{
|
||||
ElementTransformUtils.MoveElement(doc, instance.Id, vector.Flatten());
|
||||
}
|
||||
}
|
||||
break;
|
||||
case FamilyPlacementType.OneLevelBased:
|
||||
{
|
||||
ElementTransformUtils.MoveElement(doc, instance.Id, vector);
|
||||
}
|
||||
break;
|
||||
case FamilyPlacementType.OneLevelBasedHosted:
|
||||
{
|
||||
var ins = doc.Create
|
||||
.NewFamilyInstance(
|
||||
instance.GetLocXYZ(),
|
||||
instance.Symbol,
|
||||
instance.Host,
|
||||
baseLevel,
|
||||
StructuralType.NonStructural);
|
||||
ins.get_Parameter(BuiltInParameter.INSTANCE_SILL_HEIGHT_PARAM)
|
||||
.Set(baseElev - baseLevel.Elevation);
|
||||
doc.Delete(instance.Id);
|
||||
}
|
||||
break;
|
||||
case FamilyPlacementType.CurveBased:
|
||||
{
|
||||
instance.Location.Move(vector);
|
||||
//var loc = instance.GetLocCurve().CreateTransformed(Transform.CreateTranslation(vector)) as Line;
|
||||
//doc.Create.NewFamilyInstance(instance.HostFace, loc, instance.Symbol);
|
||||
//doc.Delete(instance.Id);
|
||||
}
|
||||
break;
|
||||
case FamilyPlacementType.CurveBasedDetail:
|
||||
break;
|
||||
//梁
|
||||
case FamilyPlacementType.CurveDrivenStructural:
|
||||
{
|
||||
//instance.Location.Move(vector);
|
||||
var loc = instance.GetCurve().CreateTransformed(Autodesk.Revit.DB.Transform.CreateTranslation(vector));
|
||||
//var newLoc =
|
||||
doc.Create.NewFamilyInstance(loc, instance.Symbol, baseLevel, StructuralType.Beam);
|
||||
doc.Delete(instance.Id);
|
||||
|
||||
//ElementTransformUtils.MoveElement(doc, instance.Id, vector.Flatten());
|
||||
}
|
||||
break;
|
||||
case FamilyPlacementType.Adaptive:
|
||||
break;
|
||||
case FamilyPlacementType.Invalid:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (item is Wall wall)
|
||||
{
|
||||
var flat = vector.Flatten();
|
||||
ElementTransformUtils.MoveElement(doc, wall.Id, flat);
|
||||
doc.Regenerate();
|
||||
SetWallHeight(vector, levels, wall);
|
||||
var elemIds = wall.FindInserts(true, true, true, true);
|
||||
foreach (var id in elemIds)
|
||||
{
|
||||
var elem = doc.GetElement(id);
|
||||
if (elem is Wall nestWall)
|
||||
{
|
||||
SetWallHeight(vector, levels, nestWall);
|
||||
}
|
||||
else
|
||||
{
|
||||
MoveElement(elem, vector);
|
||||
}
|
||||
}
|
||||
//墙饰条
|
||||
var sweeps = doc.OfClass
|
||||
<WallSweep>().OfType<WallSweep>().Where(s => s.GetHostIds().Contains(wall.Id));
|
||||
foreach (var sweep in sweeps)
|
||||
{
|
||||
//ElementTransformUtils.MoveElement(doc, sweep.Id, flat);
|
||||
var boundingBox = sweep.get_BoundingBox(null);
|
||||
var offset = boundingBox.Min.Z + vector.Z;
|
||||
|
||||
var baseLevel = levels.First(l => Math.Abs(l.Elevation - offset) == levels.Min(l => Math.Abs(l.Elevation - offset)));
|
||||
sweep.get_Parameter(BuiltInParameter.WALL_SWEEP_LEVEL_PARAM).Set(baseLevel.Id);
|
||||
sweep.get_Parameter(BuiltInParameter.WALL_SWEEP_OFFSET_PARAM).Set(offset - baseLevel.Elevation);
|
||||
}
|
||||
//依附在墙上的实例
|
||||
var instances = doc.OfClass<FamilyInstance>().OfType<FamilyInstance>().Where(s =>
|
||||
{
|
||||
|
||||
var stackedWallIds = wall.GetStackedWallMemberIds();
|
||||
if (stackedWallIds.Count > 0)
|
||||
{
|
||||
return stackedWallIds.Any(id => s.Host?.Id == id);
|
||||
}
|
||||
return s.Host?.Id == wall.Id;
|
||||
}).ToList();
|
||||
foreach (var ins in instances)
|
||||
{
|
||||
//ins.Location.Move(vector);
|
||||
ElementTransformUtils.MoveElement(doc, ins.Id, vector.Z * XYZ.BasisZ);
|
||||
}
|
||||
|
||||
//ElementTransformUtils.CopyElements(v1, [wall.Id], v2, Transform.Identity, new CopyPasteOptions());
|
||||
//var b = wall.Location.Move(vector);
|
||||
|
||||
//var loc = wall.GetLocCurve();
|
||||
//var c = loc.CreateTransformed(Transform.CreateTranslation(vector));
|
||||
//(wall.Location as LocationCurve).Curve = c; //可以移动,但是偏移量属性没更新
|
||||
}
|
||||
else if (item is Room room)
|
||||
{
|
||||
}
|
||||
else if (item is Stairs stairs)
|
||||
{
|
||||
var flat = vector.Flatten();
|
||||
ElementTransformUtils.MoveElement(doc, item.Id, flat);
|
||||
}
|
||||
else if (item is ModelCurve curve)//房间分割
|
||||
{
|
||||
|
||||
}
|
||||
else if (item is Railing railing)
|
||||
{
|
||||
if (railing.HasHost)
|
||||
{
|
||||
|
||||
}
|
||||
else//连带主体移动
|
||||
{
|
||||
ElementTransformUtils.MoveElement(doc, item.Id, vector);
|
||||
}
|
||||
}
|
||||
//坡道
|
||||
else if (item.Category.ToBuiltInCategory() == BuiltInCategory.OST_Ramps)
|
||||
{
|
||||
var flat = vector.Flatten();
|
||||
ElementTransformUtils.MoveElement(doc, item.Id, flat);
|
||||
}
|
||||
else if (item is TopographySurface surface)
|
||||
{
|
||||
}
|
||||
else if (item is SlabEdge or Fascia or Gutter)
|
||||
{
|
||||
return;
|
||||
}
|
||||
//else if (item is CeilingAndFloor ceilingAndFloor)
|
||||
//{
|
||||
// ElementTransformUtils.MoveElement(doc, ceilingAndFloor.Id, vector);
|
||||
//}
|
||||
else if (item is Opening opening)
|
||||
{
|
||||
if (opening.Host is Wall)
|
||||
{
|
||||
ElementTransformUtils.MoveElement(doc, opening.Id, vector.Z * XYZ.BasisZ);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ElementTransformUtils.MoveElement(doc, item.Id, vector);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 设置墙高度
|
||||
/// </summary>
|
||||
/// <param name="vector"></param>
|
||||
/// <param name="levels"></param>
|
||||
/// <param name="wall"></param>
|
||||
private static void SetWallHeight(XYZ vector, List<Level> levels, Wall wall)
|
||||
{
|
||||
var boundingBox = wall.get_BoundingBox(null);
|
||||
//底部实际高度
|
||||
var bottomElev = boundingBox.Min.Z + vector.Z;
|
||||
var topElev = boundingBox.Max.Z + vector.Z;
|
||||
//查找距离底部偏移最近的Level
|
||||
var baseLevel = GetClosetLevel(levels, bottomElev);
|
||||
wall.get_Parameter(BuiltInParameter.WALL_BASE_CONSTRAINT).Set(baseLevel.Id);
|
||||
wall.get_Parameter(BuiltInParameter.WALL_BASE_OFFSET).Set(bottomElev - baseLevel.Elevation);
|
||||
//是否有顶部约束
|
||||
var topContraint = wall.get_Parameter(BuiltInParameter.WALL_HEIGHT_TYPE).AsElementId();
|
||||
if (topContraint != ElementId.InvalidElementId)
|
||||
{
|
||||
var topLevel = GetClosetLevel(levels, topElev);
|
||||
|
||||
wall.get_Parameter(BuiltInParameter.WALL_HEIGHT_TYPE).Set(topLevel.Id);
|
||||
wall.get_Parameter(BuiltInParameter.WALL_TOP_OFFSET).Set(topElev - topLevel.Elevation);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取距离最近的标高
|
||||
/// </summary>
|
||||
/// <param name="levels"></param>
|
||||
/// <param name="elev">高度</param>
|
||||
/// <returns></returns>
|
||||
private static Level GetClosetLevel(List<Level> levels, double elev)
|
||||
{
|
||||
return levels.First(l => Math.Abs(l.Elevation - elev) == levels.Min(l => Math.Abs(l.Elevation - elev)));
|
||||
}
|
||||
/// <summary>
|
||||
/// 旋转元素
|
||||
/// </summary>
|
||||
|
||||
@@ -43,7 +43,44 @@ internal static class FamilyInstanceExtensions
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 是否已连接
|
||||
/// </summary>
|
||||
/// <param name="ins"></param>
|
||||
/// <returns></returns>
|
||||
public static bool IsConnectToSystem(this FamilyInstance ins)
|
||||
{
|
||||
bool hasConnectToSystem = false;
|
||||
if (ins.Category.CategoryType != CategoryType.Model)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (ins.get_BoundingBox(null) != null &&
|
||||
ins.MEPModel?.ConnectorManager != null)
|
||||
{
|
||||
var cons = ins.GetConnectors(false);
|
||||
|
||||
foreach (Connector con in cons)
|
||||
{
|
||||
if (con.Domain != Domain.DomainElectrical && con.Domain != Domain.DomainUndefined)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (con.IsConnected)
|
||||
{
|
||||
hasConnectToSystem = true;
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return hasConnectToSystem;
|
||||
|
||||
}
|
||||
public static void Rotate(this Autodesk.Revit.DB.FamilyInstance familyInstance, double radian)
|
||||
{
|
||||
var axis = Line.CreateBound(familyInstance.GetTransform().Origin, familyInstance.GetTransform().Origin + XYZ.BasisZ);
|
||||
|
||||
Reference in New Issue
Block a user