変位ビュー

変位ビュー

DisplacementElement クラスを使用して、変位ビューを作成します。DisplacementElement はビュー固有の要素であり、これを使用することで実際の位置から要素を変位させることができます。変位ビューは、モデル要素とモデル全体との関係を示すのに便利です。DisplacementElement はモデル要素の位置を実際に変更するわけではなく、単に別の位置に表示させるだけです。

変位ビューの作成の詳しい例については、Revit SDK の DisplacementElementAnimation サンプルを参照してください。

変位ビューを作成する

静的 DisplacementElement.Create()メソッドは新しい DisplacementElement を作成します。parentDisplacementElement が null でない場合、新しい DisplacementElement を親 DisplacementElement の子にすることができます。親が指定されている場合、子 DisplacementElement の変換は親の DisplacementElement の変換に連結し、関連する要素の変位は親 DisplacementElement を基準とします。

また、Create()メソッドにもドキュメント、変位する要素のリスト、所有者ビュー、変位要素のグラフィックスに適用される移動が必要です。要素は、任意のビューの単一の DisplacementElement によってのみ変位できます。1 つの要素を複数の DisplacementElement に割り当てると、例外が発生します。

Create()を呼び出す前に DisplacementElement のその他の静的メソッドを使用すれば例外を回避できます。CanCategoryBeDisplaced()は特定のカテゴリに属する要素を変位できるかどうかをテストし、オーバーロードされた静的メソッド CanElementsBeDisplaced()は特定の要素を新しい DisplacementElement に割り当てることができるかどうかを示します。IsAllowedAsDisplacedElement()は、単一の要素の変位の適格性をテストします。

静的 GetAdditionalElementsToDisplace()メソッドは、指定したビューの指定した要素に沿って変位される追加の要素を返します。たとえば、壁を変位すると、挿入またはホストされている要素も変位されます。

子 DisplacementElement を作成する場合、静的 IsValidAsParentInView()を使用すると、特定の DisplacementElement が特定のビューの親として使用できることを確認できます。

DisplacementElement のその他の静的メソッドを使用すると、特定の要素を含む DisplacementElement を見つけたり、ビュー内のすべての変位要素のリストを取得したり、特定のビューが所有するすべての DisplacementElements を取得することができます。

変位要素で作業する

新しい DisplacementElement を作成した後は、子 DisplacementElement を取得したり、DisplacementElement の影響を受けるすべての要素の ID を取得したり、DisplacementElement とすべての子 DisplacementElement の影響を受けるすべての要素の ID を取得するメソッドを使用できます。ParentId プロパティは、親 DisplacementElement がある場合は、その要素 ID を返します。

作成後は、SetDisplacedElementIds()や RemoveDisplacedElement()を使用して DisplacementElement に影響を受ける一連の要素を修正できます。さらに、相対変位は変更することができます。

メソッド ResetDisplacedElements()は DisplacementElement の移動を(0, 0, 0)に設定します。DisplacementElement は引き続き存在しますが、その要素は実際の位置に表示されます。

変位パスを作成する

DisplacementPath は DisplacementElement に関連するビュー固有の注釈です。DisplacementPath クラスは、実際の位置から変位先の位置までの要素の移動を表す注釈を作成します。DisplacementPath は DisplacementElement の変位要素のエッジ上の点を参照して DisplacementElement に固定されます。これは、変位要素の特定の点を原点とする単一の線分または一連の折り曲げ線で表されます。

静的 DisplacementPath.Create()メソッドには、ドキュメント、関連する DisplacementElement の ID、DisplacementElement によって変位された要素のうちの 1 つのエッジまたは曲線を参照する参照、指定したエッジのパラメータに沿った範囲[0,1]内の値が必要です。作成後は、PathStyle プロパティを使用して DisplacementPath のパス スタイルを設定できます。SetAnchorPoint()を使用すれば、アンカー ポイントも変更できます。

次の例では、垂直方向と水平方向に作られた最初の壁を移動して、それに変位パスを追加することで変位を作成します。

コード領域: 変位とパスを作成
public static void CreateDisplacementAndPath(Document doc, View view)
{
    // Find roof
    FilteredElementCollector fec = new FilteredElementCollector(doc);
    fec.OfClass(typeof(RoofBase));
    RoofBase roof = fec.FirstElement() as RoofBase;

    // Get a geometric reference for the path
    Reference edgeRef = GetHorizontalEdgeReference(roof);

    using (Transaction t = new Transaction(doc, "CreateDisplacementAndPath"))
    {
        t.Start();
        // Create a new top level DisplacementElement
        DisplacementElement dispElem = DisplacementElement.Create(doc, new ElementId[] { roof.Id }, new XYZ(10, 0, 20), view, null);

        // Create the path associated to the element
        DisplacementPath.Create(doc, dispElem, edgeRef, 0.5);
        t.Commit();
    }
}

private static Reference GetHorizontalEdgeReference(Element elem)
{
    //Find target edge from lower face of roof
    Options options = new Options();
    options.ComputeReferences = true;

    GeometryElement geomElem = elem.get_Geometry(options);

    foreach (var geomObj in geomElem)
    {
        if (geomObj is Solid)
        {
            Solid solid = geomObj as Solid;
            var faces = solid.Faces;

            foreach (Face face in faces)
            {
                BoundingBoxUV box = face.GetBoundingBox();
                UV midpoint = (box.Min + box.Max) / 2.0;
                if (face.ComputeNormal(midpoint).Normalize().Z < -0.1) // Downward facing, this is good enough
                {
                    var edgeLoops = face.EdgeLoops;
                    foreach (EdgeArray edgeArray in edgeLoops)
                    {
                        foreach (Edge edge in edgeArray)
                        {
                            // horizontal?
                            if (Math.Abs(edge.AsCurve().ComputeDerivatives(0.0, true).BasisX.DotProduct(XYZ.BasisZ)) - 1 <= 0.00001)
                            {
                                return edge.Reference;
                            }
                        }
                    }
                }
            }
        }
    }

    return null;
}

関連した DisplacementElement は親 DisplacementElement を持つことができ、この親は一連の祖先を作る自身の親 DisplacementElement を設定できます。端点は点の元の位置(変位されていない)か、これらの祖先 DisplacementElements に対応する中間の変位位置のいずれかの対応する点に設定できます。DisplacementPath.AncestorIdx プロパティはパスの端点を指定します。