Revit SDK 介绍:PathOfTravel

前言

Revit 有不少分析功能,比如这个行进路径的规划。也可参考:Dynamo For Revit: Path of Travel 行进路径

行进路径

SDK 中的这个例子,有三个选项,分别是:

  1. 从单个房间的各个角点到单扇门;
  2. 从所有房间的中心点到单扇门;
  3. 从所有房间的各个角点到各个门。

从单个房间的各个角点到单扇门

关键逻辑

找到各个房间的角点:

  1. 拿到房间的边界;
  2. 循环各条边偏移并计算交叉点,即角点。
private static void AppendRoomNearCornerPoints(Room room, List<XYZ> nearCornerPoints)
{
   IList<IList<BoundarySegment>> segments = room.GetBoundarySegments(new SpatialElementBoundaryOptions());

   // First region only
   IList<BoundarySegment> firstSegments = segments[0];
   int numSegments = firstSegments.Count;

   for (int i = 0; i < numSegments; i++)
   {
      BoundarySegment seg1 = firstSegments.ElementAt(i);
      BoundarySegment seg2 = firstSegments.ElementAt(i == numSegments - 1 ? 0 : i + 1);

      Curve curve1 = seg1.GetCurve();
      Curve curve2 = seg2.GetCurve();

      Curve offsetCurve1 = curve1.CreateOffset(-1.5, XYZ.BasisZ);
      Curve offsetCurve2 = curve2.CreateOffset(-1.5, XYZ.BasisZ);

      IntersectionResultArray intersections = null;
      SetComparisonResult result = offsetCurve1.Intersect(offsetCurve2, out intersections);

      // First intersection only
      if (result == SetComparisonResult.Overlap && intersections.Size == 1)
      {
         nearCornerPoints.Add(intersections.get_Item(0).XYZPoint);
      }
   }
}

计算房间room角点到各个终点endPoints

  1. 计算房间 room 的各个角点;
  2. PathOfTravel::CreateMapped 创建多对多的行进路径。
private static void GeneratePathsOfTravelForOneRoomManyDoors(Document doc, ViewPlan viewPlan, Room room, List<XYZ> endPoints, ResultsSummary resultsSummary)
{
   List<XYZ> sourcePoints = GetRoomNearCornerPoints(room);
   resultsSummary.numSourcePoints += sourcePoints.Count;

   using (Transaction t = new Transaction(doc, "Generate paths of travel"))
   {
      t.Start();
      IList<PathOfTravelCalculationStatus> statuses;
      IList<PathOfTravel> pathsOfTravel = PathOfTravel.CreateMapped(viewPlan, sourcePoints, endPoints, out statuses);

      foreach (PathOfTravel pOT in pathsOfTravel)
      {
         if (pOT == null) resultsSummary.numFailures++;
         else resultsSummary.numSuccesses++;
      }
      t.Commit();
   }
}

计算从单个房间各个角点到单扇门。

private static void GeneratePathsOfTravelForOneRoomOneDoor(Document doc, ViewPlan viewPlan, Room room, XYZ endPoint, ResultsSummary resultsSummary)
{
   GeneratePathsOfTravelForOneRoomManyDoors(doc, viewPlan, room, new List<XYZ> { endPoint }, resultsSummary);
}

运行效果

在这里插入图片描述

从所有房间的中心点到单扇门

关键逻辑

private void CreatePathsOfTravelRoomCenterpointsToSingleDoor(UIDocument uiDoc)
{
   Document doc = uiDoc.Document;
   ViewPlan viewPlan = uiDoc.ActiveView as ViewPlan;
   ElementId levelId = viewPlan.GenLevel.Id;

   // 选择一扇门作为目标
   Reference reference = uiDoc.Selection.PickObject(ObjectType.Element, new DoorSelectionFilter(), "Select a target door");
   Instance doorElement = doc.GetElement(reference) as Instance;
   Transform trf = doorElement.GetTransform();
   XYZ endPoint = trf.Origin;

   // 找到所有房间
   FilteredElementCollector fec = new FilteredElementCollector(doc);
   fec.WherePasses(new Autodesk.Revit.DB.Architecture.RoomFilter());

   List<XYZ> startPoints = new List<XYZ>();

   // 找到所有房间的中心点
   foreach (Room room in fec.Cast<Room>().Where<Room>(rm => rm.Level.Id == levelId))
   {
      LocationPoint location = room.Location as LocationPoint;
      if (location == null)
         continue;
      XYZ roomPoint = location.Point;
      startPoints.Add(roomPoint);
   }
   
   // 生成行进路径       
   using (Transaction t = new Transaction(doc, "Generate paths of travel"))
   {
      t.Start();
      IList<PathOfTravelCalculationStatus> statuses;
      PathOfTravel.CreateMapped(viewPlan, startPoints, new List<XYZ> { endPoint }, out statuses);
      t.Commit();
   }
}

运行效果

在这里插入图片描述

从所有房间的各个角点到各个门

关键逻辑:实际上是上面两个功能的混合。可自行参考代码。
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客BIM工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值