Revit API は、空間要素(部屋とスペース)の 3D ジオメトリへのアクセスを提供します。
SpatialElementGeometryCalculator クラスを使用して空間要素のジオメトリを計算し、ジオメトリと要素の境界要素の間の関係を習得できます。このユーティリティに提供される 2 つのオプションがあります。
ジオメトリの計算結果は、クラス SpatialElementGeometryResults に含まれます。SpatialElementGeometryResults クラスから次を取得できます。
各サブフェースは次を提供します。
このユーティリティの使用に関する注意事項:
次の例では、部屋のジオメトリを計算し、その境界面を検索します
|
コード領域: SpatialElementGeometryCalculator を使用した面領域 |
SpatialElementGeometryCalculator calculator = new SpatialElementGeometryCalculator(doc);
// compute the room geometry
SpatialElementGeometryResults results = calculator.CalculateSpatialElementGeometry(room);
// get the solid representing the room's geometry
Solid roomSolid = results.GetGeometry();
foreach (Face face in roomSolid.Faces)
{
double faceArea = face.Area;
// get the sub-faces for the face of the room
IList<SpatialElementBoundarySubface> subfaceList = results.GetBoundaryFaceInfo(face);
foreach (SpatialElementBoundarySubface subface in subfaceList)
{
if (subfaceList.Count > 1) // there are multiple sub-faces that define the face
{
// get the area of each sub-face
double subfaceArea = subface.GetSubface().Area;
// sub-faces exist in situations such as when a room-bounding wall has been
// horizontally split and the faces of each split wall combine to create the
// entire face of the room
}
}
}
|
次の例では、部屋のジオメトリを計算し、部屋を設定する要素に属している面のマテリアルを検索します。
|
コード領域: SpatialElementGeometryCalculator を使用した面のマテリアル |
public void MaterialFromFace()
{
string s = "";
Document doc = this.Document;
UIDocument uidoc = new UIDocument(doc);
Room room = doc.GetElement(uidoc.Selection.PickObject(ObjectType.Element).ElementId) as Room;
SpatialElementBoundaryOptions spatialElementBoundaryOptions = new SpatialElementBoundaryOptions();
spatialElementBoundaryOptions.SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Finish;
SpatialElementGeometryCalculator calculator = new SpatialElementGeometryCalculator(doc, spatialElementBoundaryOptions);
SpatialElementGeometryResults results = calculator.CalculateSpatialElementGeometry(room);
Solid roomSolid = results.GetGeometry();
foreach (Face roomSolidFace in roomSolid.Faces)
{
foreach (SpatialElementBoundarySubface subface in results.GetBoundaryFaceInfo(roomSolidFace))
{
Face boundingElementface = subface.GetBoundingElementFace();
ElementId id = boundingElementface.MaterialElementId;
s += doc.GetElement(id).Name + ", id = " + id.IntegerValue.ToString() + "\n";
}
}
TaskDialog.Show("revit",s);
}
|