Dynamo For Revit: FamilyInstance Nodes

前言

本文介绍 Revit 2021.1 新加的 FamilyInstance 节点以及相关概念。

内容

增加了四个节点:

  • FamilyInstance.Transform 通过两个坐标系,对族实例进行坐标变换。
  • FamilyInstance.ByCoordinateSystem 通过坐标放置族实例,坐标系定义了族实例的位置点和朝向。
  • FamilyInstance.Room 得到族实例所在房间。
  • FamilyInstance.Space 得到族实例所在空间。

FamilyInstance.Transform

通过两个坐标系,对族实例进行坐标变换。输入是两个坐标系,然后通过这两个坐标计算旋转角度和移动的位置。
旋转角度计算,注意 fromCS 没有被用到,有 bug:

// DynamoRevit\src\Libraries\RevitNodes\Elements\FamilyInstance.cs
private double GetRotationFromCS(CoordinateSystem fromCS, CoordinateSystem contextCS)
{
    
    
   var elementTransform = this.InternalFamilyInstance.GetTransform();
   var newTransform = contextCS.ToTransform() as Autodesk.Revit.DB.Transform;
   var oldTransform = fromCS.ToTransform() as Autodesk.Revit.DB.Transform;
   double[] oldRotationAngles;
   TransformUtils.ExtractEularAnglesFromTransform(oldTransform, out oldRotationAngles);
   double[] newRotationAngles;
   TransformUtils.ExtractEularAnglesFromTransform(newTransform, out newRotationAngles);
   return ConvertEularToAngleDegrees(newRotationAngles.FirstOrDefault());
}

位置变换,最终是通过 Autodesk.DesignScript.Geometry.Geometry 下面的 public Geometry Transform(CoordinateSystem fromCoordinateSystem, CoordinateSystem contextCoordinateSystem)

// DynamoRevit\src\Libraries\RevitNodes\Elements\FamilyInstance.cs
private void SetLocationFromCS(CoordinateSystem fromCS, CoordinateSystem contextCS)
{
    
    
   var locationGeometry = this.InternalElement.Location;
   if (locationGeometry is Autodesk.Revit.DB.LocationCurve)
   {
    
    
      var locationCurve = locationGeometry as Autodesk.Revit.DB.LocationCurve;
      var dynamoCurve = locationCurve.Curve.ToProtoType();
      var newLocation = dynamoCurve.Transform(fromCS, contextCS) as Curve;
      locationCurve.Curve = newLocation.ToRevitType(true);
      dynamoCurve.Dispose();
      newLocation.Dispose();
      return;
   }
   else if (locationGeometry is Autodesk.Revit.DB.LocationPoint)
   {
    
    
      var location = this.InternalElement.Location as Autodesk.Revit.DB.LocationPoint;
      var dynamoPoint = location.Point.ToPoint(true);
      var newLocation = dynamoPoint.Transform(fromCS, contextCS) as Autodesk.DesignScript.Geometry.Point;
      location.Point = newLocation.ToRevitType(true);
      dynamoPoint.Dispose();
      newLocation.Dispose();
      return;
   }
   throw new Exception(Properties.Resources.InvalidElementLocation);
}

下图是一个简单例子,可从 github 获取
在这里插入图片描述

FamilyInstance.ByCoordinateSystem

通过坐标放置族实例,坐标系定义了族实例的位置点和朝向。
在这里插入图片描述

FamilyInstance.Room

得到族实例所在房间,对应的是:

// class Autodesk.Revit.DB.FamilyInstance
public Room Room {
    
     get; }

在这里插入图片描述
发现并不是所有的族实例都有 Room 的值,不知道这个值在哪里设置的。

FamilyInstance.Space

得到族实例所在空间,对应的是:

在这里插入图片描述
和上面的选中的是同一个 FamilyInstance,一个得到的是 Room,另一个是 Space。它们之间是有依赖关系,看下图,可以通过 Space 的属性得到 Room

// class Autodesk.Revit.DB.FamilyInstance
public Space Space {
    
     get; }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44153630/article/details/108028788
今日推荐