部屋

部屋

次のセクションでは、部屋クラス、そのパラメータ、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

いいえ

注: Room.Name は部屋名と部屋番号の組み合わせです。たとえば、番号が 2、名前が「Master Bedroom」の部屋の場合、Room.Name は「Master Bedroom 2」を返します。部屋名を取得するには、ROOM_NAME BuiltInParameter を使用します。
注: 注釈要素として、RoomTag.View を使用して、特定のビューを使用できます。RoomTag.Name プロパティを設定しないでください。名前は自動的に割り当てられます。そうでない場合は例外がスローされます。

部屋を作成する

次のコードは、特定のレベルの特定のポイントで部屋を作成する最も簡単な方法を示します。

コード領域 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;
}

部屋は部屋集計表で作成し、平面図の回路に挿入することができます。

  • Document.NewRoom(Phase) メソッドを使用して、特定の位置に関連付けられていない新しい部屋を作成して、既存の集計表に挿入します。部屋集計表が存在すること、または呼び出す前に指定されたフェーズの部屋集計表を作成していることを確認します。
  • Document.NewRoom(Room room, PlanCircuit circuit) メソッドを使用して、集計表と PlanCircuit の部屋から部屋を作成します。
    • 入力した部屋は、部屋集計表にのみ存在する必要があります。つまり平面図ビューには表示されません。
    • メソッドの起動後、同じ名前と番号を持つモデルの部屋を PlanCircuit が配置されているビューで作成します。

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

領域を作成するセグメントは、BoundarySegment クラスで表され、要素プロパティは次の条件に該当する要素を返します。

  • ModelCurve 要素の場合、カテゴリは、部屋の分割を表す BuiltInCategory.OST_AreaSeparationLines である必要があります。
  • 壁、柱、屋根などの他の要素の場合は、要素が部屋の境界である場合は、部屋の境界パラメータ(BuiltInParameter.WALL_ATTR_ROOM_BOUNDING)は次の図のように true である必要があります。

図 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 が、前の図に示すように、部屋分割と壁の間の曲線に対応している場合:

  • 要素プロパティは、null を返します
  • 曲線が null ではありません。

境界とトランザクション

壁などの 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 クラスを使用して、レベル トポロジを表します。

  • レベルを使用して、Document オブジェクトから PlanTopology オブジェクトを取得します。各平面図ビューには、各フェーズに対応する 1 つ の PlanTopology があります。
  • 部屋の分割を除く BoundarySegment に同じ条件が適用され、部屋の境界パラメータが true である要素は、PlanCircuit の側面(境界)になります。

図 146: 部屋およびプラン トポロジの図表

PlanCircuit.SideNum プロパティは回路側の番号を返し、SpatialElement.GetBoundarySegments()は IList<IList<Autodesk.Revit.DB.BoundarySegment> を返します。この Count は回路側の番号とは異なります。

  • SpatialElement.GetBoundarySegments()は、壁に分岐がある場合は、下の壁を 2 つの壁と認識します。
  • PlanCircuit.SideNum は、枝の数に関係なく、常に画像の下の壁を 1 つとみなします。

図 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)

部屋および FamilyInstance

ドアと窓は、部屋に関連する特別なファミリのインスタンスです。窓は反転させるハンドルがない点のみが違うため、ここではドアのみを説明しています。

次の特性がドアに適用されます。

  • ドア要素は部屋なしでも存在できます。
  • API (および API 内のみ)では、ドア要素にはドアの 2 つの反対側の領域を参照する 2 つの追加のプロパティ、ToRoom と FromRoom があります。
  • 領域が部屋の場合は、要素プロパティの値は部屋要素になります。
  • 領域が部屋でない場合、プロパティは null を返します。両方のプロパティは、同時に null である場合があります。
  • ドアが開く側の領域は、ToRoom になります。反対側の部屋は FromRoom になります。
  • 両方のプロパティは、対応する領域が変更されるたびに動的に更新されます。

次の画像では、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 クラスには、オブジェクトに関する情報を取得するために使用できる、いくつかのその他のプロパティがあります。部屋には読み込み専用の寸法プロパティがあります。

  • エリア
  • Perimeter
  • UnboundedHeight
  • Volume
  • ClosedShell

この例では、選択した部屋の寸法情報を示します。体積計算設定を有効にする、または部屋体積を 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 サンプル アプリケーションを参照してください。

また、これらのプロパティを持つ部屋に基準レベルからのオフセットや上限のオフセットを取得または設定できます。

  • BaseOffset
  • LimitOffset

UpperLimit プロパティを使用して、部屋の上限を定義するレベルを取得または設定できます。