前言
本文介绍 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; }