次のセクションでは、部屋クラス、そのパラメータ、API で部屋クラスを使用する方法の詳細について説明します。
部屋クラスを使用して、部屋集計表やエリア平面図などの部屋や要素を表します。さまざまな部屋、エリア、および API でこれらに対応するタグのプロパティや作成関数を次の表に示します。
表 55: 部屋、エリア、タグの関係
要素 |
クラス |
カテゴリ |
境界 |
場所 |
作成できるもの |
平面図ビューでの部屋 |
Room |
OST_Rooms |
閉じた領域内の場合はあります |
LocationPoint |
NewRoom(Phase)を除く NewRoom() |
集計表ビューでの部屋 |
Room |
OST_Rooms |
NULL |
NULL |
NewRoom(Phase) |
エリア |
Room |
OST_Areas |
常にあります |
LocationPoint |
いいえ |
部屋タグ |
RoomTag |
OST_RoomTags |
LocationPoint |
Creation.Document.NewRoomTag() |
|
エリア タグ |
FamilySymbol |
OST_AreaTags |
LocationPoint |
いいえ |
次のコードは、特定のレベルの特定のポイントで部屋を作成する最も簡単な方法を示します。
コード領域 28-1: 部屋を作成 |
Room CreateRoom(Autodesk.Revit.DB.Document document, Level level) { // Create a UV structure which determines the room location UV roomLocation = new UV(0, 0); // Create a new room Room room = document.Create.NewRoom(level, roomLocation); if (null == room) { throw new Exception("Create a new room failed."); } return room; } |
部屋は部屋集計表で作成し、平面図の回路に挿入することができます。
PlanCircuit の詳細は、「プラン トポロジ」を参照してください。
次のコードは、プロセス全体を示します。
コード領域 28-2: 部屋を平面図の回路に作成、挿入 |
Room InsertNewRoomInPlanCircuit(Autodesk.Revit.DB.Document document, Level level, Phase newConstructionPhase) { // create room using Phase Room newScheduleRoom = document.Create.NewRoom(newConstructionPhase); // set the Room Number and Name string newRoomNumber = "101"; string newRoomName = "Class Room 1"; newScheduleRoom.Name = newRoomName; newScheduleRoom.Number = newRoomNumber; // Get a PlanCircuit PlanCircuit planCircuit = null; // first get the plan topology for given level PlanTopology planTopology = document.get_PlanTopology(level); // Iterate circuits in this plan topology foreach (PlanCircuit circuit in planTopology.Circuits) { // get the first circuit we find if (null != circuit) { planCircuit = circuit; break; } } Room newRoom2 = null; if (null != planCircuit) { using (Transaction transaction = new Transaction(document, "Create Room")) { if (transaction.Start() == TransactionStatus.Started) { // The input room must exist only in the room schedule, // meaning that it does not display in any plan view. newRoom2 = document.Create.NewRoom(newScheduleRoom, planCircuit); // a model room with the same name and number is created in the // view where the PlanCircuit is located if (null != newRoom2) { // Give the user some information TaskDialog.Show("Revit", "Room placed in Plan Circuit successfully."); } transaction.Commit(); } } } return newRoom2; } |
ある位置に部屋を作成、追加すると、Room.Unplace()メソッドを使用してその位置からこれを削除できます(ただしプロジェクトでは使用可能なままです)。その後、新しい位置に配置することができます。
部屋には、部屋が配置されている閉じた領域を作成する境界があります。
部屋の周囲の境界は、基本クラス メソッド SpatialElement.GetBoundarySegments()から取得されます。部屋が閉じた領域にない、または集計表のみに存在する場合は、メソッドは null を返します。各部屋にはいくつかの境界があり、それぞれにはいくつかのセグメントがあります。したがって、データは BoundarySegment リストの形式で返されます。
次の図は、Revit UI で選択された部屋の境界を示しています。
図 138: 部屋の境界
セグメント リストのサイズは、閉じた領域のトポロジによって異なります。 各 BoundarySegment リストは、回路またはあるセグメントと次を結合する、連続した 1 本の線分を作成します。次の図では、いくつかの例を示します。次の図では、すべての壁が部屋の境界で、モデル線分カテゴリは OST_AreaSeparationLines です。要素が部屋の境界でない場合は、境界を作成する要素から除外されます。
図 139: 部屋 1、2、3、4
図 140: 部屋 5、6
次の表では、前の部屋の Room.GetBoundarySegments().Size の結果を示します。
表 56: Room.GetBoundarySegments().Size
Room |
Room.GetBoundarySegments().Size |
部屋 1 部屋 2 部屋 3 |
1 |
部屋 4 |
2 |
部屋 5 部屋 6 |
3 |
IList<IList<BoundarySegment> を取得後、リストを繰り返すことで BoundarySegment を取得します。
領域を作成するセグメントは、BoundarySegment クラスで表され、要素プロパティは次の条件に該当する要素を返します。
図 141: 部屋の境界プロパティ
WALL_ATTR_ROOM_BOUNDING BuiltInParameter は、API から設定されます。
コード領域: 28-3 部屋の境界を設定 |
public void SetRoomBounding(Wall wall) { Parameter parameter = wall.get_Parameter(BuiltInParameter.WALL_ATTR_ROOM_BOUNDING); parameter.Set(1); //set "Room Bounding" to true parameter.Set(0); //set "Room Bounding" to false } |
次の図で、屋根がどのように部屋の BoundarySegment を形成しているか見てください。最初の図では、立面図ビューのレベル 3 を示しています。 部屋はレベル 3 の平面図ビューに作成されます。 後者の 2 つの画像は、部屋の境界と家を 3D ビューで示しています。
図 142: レベル 3 ビューで作成された部屋
図 143: 屋根で形成された部屋の境界
エリア境界は、エリア境界カテゴリ(BuiltInCategory.OST_AreaSchemeLines)を使用した ModelCurve のみであり、表示された部屋の境界は、壁や他の要素の場合があります。
図 144: 壁の端点のエッジ
BoundarySegment が、前の図に示すように、部屋分割と壁の間の曲線に対応している場合:
壁などの API を使用して要素を作成した後に Room.GetBoundarySegments()を呼び出す場合、壁は部屋の境界を変更することができます。データが更新されていることを確認する必要があります。
次の図では、Revit プラットフォーム API を使用して壁を作成した後に部屋を変更する方法を示します。
図 145: 追加された壁が部屋の境界を変更
部屋の境界データを更新するには、次のコードで、トランザクション メカニズムを使用します。
コード領域 28-4: トランザクションを使用して部屋の境界を更新 |
public void UpdateRoomBoundary(UIApplication application, Room room, Level level) { Document document = application.ActiveUIDocument.Document; //Get the size before creating a wall int size = room.GetBoundarySegments(new SpatialElementBoundaryOptions()).First().Count; string message = "Room boundary size before wall: " + size; //Prepare a line XYZ startPos = new XYZ(-10, 0, 0); XYZ endPos = new XYZ(10, 0, 0); Line line = Line.CreateBound(startPos, endPos); //Create a new wall and enclose the creating into a single transaction using (Transaction transaction = new Transaction(document, "Create Wall")) { if (transaction.Start() == TransactionStatus.Started) { Wall wall = Wall.Create(document, line, level.Id, false); if (null != wall) { if (TransactionStatus.Committed == transaction.Commit()) { //Get the new size size = room.GetBoundarySegments(new SpatialElementBoundaryOptions()).First().Count; message += "\nRoom boundary size after wall: " + size; TaskDialog.Show("Revit", message); } } else { transaction.RollBack(); } } } } |
詳細は、「トランザクション」を参照してください。
部屋が配置されているレベル平面図には、壁や部屋の分割などの要素によって作成されたトポロジがあります。PlanTopology と PlanCircuit クラスを使用して、レベル トポロジを表します。
図 146: 部屋およびプラン トポロジの図表
PlanCircuit.SideNum プロパティは回路側の番号を返し、SpatialElement.GetBoundarySegments()は IList<IList<Autodesk.Revit.DB.BoundarySegment> を返します。この Count は回路側の番号とは異なります。
図 147: PlanCircuit と部屋境界を比較
表 57: PlanCircuit と部屋境界を比較
回路 |
Circuit.SideNum |
部屋の IList<IList<Autodesk.Revit.DB.BoundarySegment> .Count |
回路 1 |
3 |
3 (部屋 1) |
回路 2 |
4 +2 = 6 |
4 + 3 = 7 (部屋 2) |
回路 3 |
3 +2 = 5 |
3 + 3 = 6 (部屋 3) |
回路 4 |
3 |
3 (部屋 4) |
回路 5 |
3 |
3 (部屋 5) |
ドアと窓は、部屋に関連する特別なファミリのインスタンスです。窓は反転させるハンドルがない点のみが違うため、ここではドアのみを説明しています。
次の特性がドアに適用されます。
次の画像では、5 つのドアが面を反転させずに壁に挿入されています。この表では、FromRoom、ToRoom、各ドアの部屋プロパティを示します。部屋プロパティはすべてのファミリ インスタンスに属しています。
図 148: ドア 1
図 149: ドア 2
図 150: ドア 3
図 151: ドア 4
図 152: ドア 5
表 58: ドア プロパティ
ドア |
FromRoom |
ToRoom |
Room |
ドア 1 |
null |
null |
null |
ドア 2 |
部屋 1 |
null |
null |
ドア 3 |
部屋 3 |
部屋 2 |
部屋 2 |
ドア 4 |
部屋 4 |
null |
null |
ドア 5 |
null |
部屋 6 |
部屋 6 |
すべてのファミリ インスタンスには部屋プロパティがあります。これはインスタンスが最後に使用したプロジェクト フェーズに配置された部屋のことです。窓とドアは部屋に面しています。ドアまたは窓の面をフリップして、または FamilyInstance.FlipFromToRoom()を呼び出して部屋を変更します。梁や柱などの他のタイプのインスタンスの場合は、部屋はインスタンスと同じ境界を持つ部屋のことです。
次のコードは、ファミリ インスタンスから部屋を取得する方法を示しています。結果が null であるかどうかを確認する必要があります。
コード領域 28-5: ファミリ インスタンスから部屋を取得 |
public void GetRoomInfo(FamilyInstance familyInstance) { Room room = familyInstance.Room; room = familyInstance.FromRoom; //for door and window family only room = familyInstance.ToRoom; //for door and window family only if (null != room) { //use the room... } } |
Room クラスには、オブジェクトに関する情報を取得するために使用できる、いくつかのその他のプロパティがあります。部屋には読み込み専用の寸法プロパティがあります。
この例では、選択した部屋の寸法情報を示します。体積計算設定を有効にする、または部屋体積を 0 として返す必要があることに注意してください。
コード領域 28-6: 部屋の寸法を取得 |
public void GetRoomDimensions(Document doc, Room room) { String roominfo = "Room dimensions:\n"; // turn on volume calculations: using (Transaction t = new Transaction(doc, "Turn on volume calculation")) { t.Start(); AreaVolumeSettings settings = AreaVolumeSettings.GetAreaVolumeSettings(doc); settings.ComputeVolumes = true; t.Commit(); } roominfo += "Vol: " + room.Volume + "\n"; roominfo += "Area: " + room.Area + "\n"; roominfo += "Perimeter: " + room.Perimeter + "\n"; roominfo += "Unbounded height: " + room.UnboundedHeight + "\n"; TaskDialog.Show("Revit",roominfo); } |
部屋(またはスペース)の ClosedShell プロパティは、部屋(壁、床、天井、屋根、境界線)のオープン スペースの境界によって形成されるジオメトリです。このプロパティは、すべてまたは一部の要素が部屋に配置されているかどうか確認するなど、部屋を持っているモデルで、他の物理要素との交差を確認する必要がある場合に便利です。たとえば、ClosedShell を使用して部屋に垂直方向の境界がないかどうかを確認する場合は、Revit SDK に含まれる RoofsRooms サンプル アプリケーションを参照してください。
また、これらのプロパティを持つ部屋に基準レベルからのオフセットや上限のオフセットを取得または設定できます。
UpperLimit プロパティを使用して、部屋の上限を定義するレベルを取得または設定できます。