解析モデル

解析モデル

Revit Structure では、解析モデルは、構造モデルの技術的な概念を表します。

次の構造要素は構造部材解析モデルを持ちます。

要素の AnalyticalModel は GetAnalyticalModel()メソッドを使用して取得できます。新しく作成された構造要素の AnalyticalModel は再生成を実行するまで使用できません。要素のファミリによっては、AnalyticalModel が存在しない場合があります。AnalyticalModel 値を要素のファミリに適用しない場合、GetAnalyticalModel()メソッドは null を返します。このクラスを使用する前に、値をチェックします。AnalyticalModel は次の情報で構成されています。

特定のオプションは専用クラスで使用できます。

  • AnalyticalModelStick - 構造フレーム梁、構造フレーム ブレース、構造柱の解析モデルを表します。
  • AnalyticalModelColumn - AnalyticalModelStick のサブ クラス、構造柱の解析モデルを表します。
  • AnalyticalModelSurface - 構造床、構造基礎スラブ、構造壁の解析モデルを表します。

解析位置

AnalyticalModel に対応する要素のタイプに応じて、解析を基準とする要素の位置は、GetPoint()、GetCurve()、GetCurves()の 3 つのメソッドのいずれかによって取得できます。

これらのメソッドで取得される曲線は、[参照]プロパティ セットを持たない点に注意してください。したがって、Curve.GetEndPointReference() のようなメソッドには使用できません。代わりに、次の例に示すような必要な情報を含む AnalyticalModelSelector オブジェクトの作成を通じて、曲線やその終点への参照を取得できます。

コード領域 29-10: 解析用曲線への参照を取得

public bool GetReferenceData(FamilyInstance familyInst)
{
        AnalyticalModel analyticalModelFrame = familyInst.GetAnalyticalModel();
        Curve analyticalCurve = analyticalModelFrame.GetCurve();
        if (null != analyticalCurve)
        {
                // test the stable reference to the curve.
                AnalyticalModelSelector amSelector = new AnalyticalModelSelector(analyticalCurve);
                amSelector.CurveSelector = AnalyticalCurveSelector.WholeCurve;
                Reference curveReference = analyticalModelFrame.GetReference(amSelector);
   
                // test the stable reference to the start point of the curve
                amSelector.CurveSelector = AnalyticalCurveSelector.StartPoint;
                Reference startPointReference = analyticalModelFrame.GetReference(amSelector);

                // test the stable reference to the start point of the curve
                amSelector.CurveSelector = AnalyticalCurveSelector.EndPoint;
                Reference endPointReference = analyticalModelFrame.GetReference(amSelector);
        }

        return true;
}

GetPoint()

AnalyticalModel が 1 つの点で表現される場合(構造基礎など)、このメソッドはその点を返します。それ以外の場合は、Autodesk.Revit.Exceptions.InapplicableDataException が発生します。IsSinglePoint()メソッドを使用すると、AnalyticalModel が 1 つの点で表現可能かどうかを判別できます。

次の例は、構造基礎の解析位置を取得する方法を表しています。

コード領域 29-11: 構造基礎の位置を取得

// retrieve and iterate current selected element
UIDocument uidoc = commandData.Application.ActiveUIDocument;
ElementSet selection = uidoc.Selection.Elements;
foreach (Element e in selection)
{
        // if the element is structural footing
        FamilyInstance familyInst = e as FamilyInstance;
        if (null != familyInst && familyInst.StructuralType == StructuralType.Footing)
        {
                AnalyticalModel model = familyInst.GetAnalyticalModel();
                // structural footing should be expressable as a single point
                if (model.IsSinglePoint() == true)
                {
                        XYZ analyticalLocationPoint = model.GetPoint();
                }
        }
}

GetCurve()

AnalyticalModel が 1 つの曲線で表現される場合(構造柱や構造フレームなど)、このメソッドはその曲線を返します。それ以外の場合は、Autodesk.Revit.Exceptions.InapplicableDataException が発生します。IsSingleCurve()メソッドを使用すると、AnalyticalModel が 1 つの曲線で表現可能かどうかを判別できます。

コード領域 29-12: 構造柱の曲線を取得

public void GetColumnCurve(FamilyInstance familyInst)
{
        // get AnalyticalModel from structural column
        if (familyInst.StructuralType == StructuralType.Column)
        {
                AnalyticalModel modelColumn = familyInst.GetAnalyticalModel();
                // column should be represented by a single curve
                if (modelColumn.IsSingleCurve() == true)
                {
                        Curve columnCurve = modelColumn.GetCurve();
                }
        }
}

GetCurves()

複数の曲線で定義される AnalyticalModel の曲線を取得するには、このメソッドが必要ですが、あらゆる場合に使用可能です。AnalyticalModel が 1 つの曲線で表現される場合、このメソッドは 1 つの曲線のみを含むリストを返します。AnalyticalModel が 1 つの点で表現される場合、このメソッドは点を含む長さがほぼ 0 の曲線を返します。このメソッドは、パラメータとして AnalyticalCurveType enum を使用します。有効な値は次のとおりです。

  • RawCurves - 生成された基準の解析モデルの曲線
  • ActiveCurves - 画面に表示される曲線(固定リンクを含まない)
  • ApproximatedCurves - 直線セグメントを使用した近似曲線

固定リンクに関する次の値も使用できます。詳細については、この章で後述する「固定リンク」セクションを参照してください。

  • RigidLinkHead - 梁の端点 0 (頭)での固定リンク
  • RigidLinkTail - 梁の端点 1 (尾)での固定リンク
  • AllRigidLinks - すべての固定リンク曲線。端点 0 (頭)での固定リンクは最初のエントリに入ります。端点 1 (尾)での固定リンクは最後のエントリに入ります。

GetLoops()

構造壁、床、スラブの場合は、AnalyticalModelSurface クラスの使用をお勧めします。AnalyticalLoopType パラメータに基づいたサーフェスの一連の CurveLoop オブジェクトを取得するには、GetLoops()メソッドを使用します。有効な値は次のとおりです。
  • All - すべての解析ループ
  • External - 他のすべてのループの外側にあるループ。
  • Internal - 別のループの内部にあるループ。複数のネストされたループの場合、一番外側にあるループ以外のループを返します。
  • Filled - 内側が塗りつぶされたループ。複数のネストされたループの場合、一番外側のループと、外側から内側に向かって 2 番目のループをすべて返します。ビューでは、返されたループは、ソリッドの外部アウトラインとして表示されます。
  • Void - 内側が塗りつぶされていないループ。複数のネストされたループの場合、外側から 2 番目のループから始まる一連のループと、一番内側から 2 番目のループが返されます。ビューでは、返されたループは、開口部の外部アウトラインとして表示されます。

次の例は、構造壁に対して AnalyticalModelSurface を使用して、選択したすべての壁の外側のエッジを取得し、その座標を表示する方法を示しています。

コード領域 29-13: 構造壁のカーブを取得

// retrieve and iterate current selected element
UIDocument uidoc = commandData.Application.ActiveUIDocument;
ICollection<ElementId> selectedIds = uidoc.Selection.GetElementIds();
Document document = uidoc.Document;
foreach (ElementId id in selectedIds)
{
    Element e = document.GetElement(id);
    Wall aWall = e as Wall;
    if (null != aWall)
    {
        // get AnalyticalModelSurface from Structural Wall
        AnalyticalModelSurface modelWall = aWall.GetAnalyticalModel() as AnalyticalModelSurface;
        if (null == modelWall)
        {
            // Architecture wall doesn't have analytical model
            continue;
        }

        // get wall curves
        StringBuilder wallString = new StringBuilder();
        wallString.AppendLine("Wall curves:");
        IList<CurveLoop> wallCurveLoops = modelWall.GetLoops(AnalyticalLoopType.External);
        foreach (CurveLoop curveloop in wallCurveLoops)
        {
            CurveLoopIterator itr = curveloop.GetCurveLoopIterator();
            itr.Reset();
            while (itr.MoveNext())
            {
                Curve wallCurve = itr.Current;
                wallString.AppendLine(String.Format("{0}, {1}", wallCurve.GetEndPoint(0).ToString(), wallCurve.GetEndPoint(1).ToString()));
            }
        }

        TaskDialog.Show("Wall Analytical Model", wallString.ToString());
    }
}

パラメータ情報

AnalyticalModel では、固定リンク、投影、近似などのパラメータ情報にアクセスできます。

固定リンク

固定リンクは、梁の解析モデルを柱の解析モデルに接続します。CanHaveRigidLinks()メソッドと AnalyticalModel.RigidLinksOption プロパティを使用すると、AnalyticalModel で固定リンクを使用できるかどうかを判断できます。さらに、HasRigidLinksWith()を使用すると、AnalyticalModel が特定の要素との固定リンクを持っているかどうかを判断できます。

AnalyticalModel.GetCurves()と AnalyticalCurveType オプションの RigidLinkHead と RigidLinkTail を使用すると、端点のリンクを取得できます。もしくは、AnalyticalModel.GetRigidLink()と AnalyticalModelSelector オブジェクトを使用します。

構造梁に対する AnalyticalModel メソッドの GetCurve()と GetCurves()については、GetCurves()の場合 1 つの曲線の他に構造梁の RigidLink 曲線が含まれる(存在する場合)点が異なります。梁の頭または尾の RigidLink を取得するには、AnalyticalCurveType.RigidLinkHead または AnalyticalCurveType.RigidLinkTail enum 値を GetCurves()メソッドに渡します。

これは独立したオブジェクトではないので固定リンクを直接作成することはできませんが、梁や柱の解析モデルの RigidLinksOption プロパティを使用して作成できます。梁の固定リンク オプションは、柱のオプションに優先します。

構造梁の場合、RigidLinksOption プロパティには次の値を設定できます。

  • AnalyticalRigidLinksOption.Enabled - 固定リンクが形成されます
  • AnalyticalRigidLinksOption.Disabled - 固定リンクが形成されません
  • AnalyticalRigidLinksOption.FromColumn - 対応する構造柱の値に応じて、固定リンクが形成される場合があります。

構造柱の場合、RigidLinksOption プロパティには次の値を設定できます。

  • AnalyticalRigidLinksOption.Enabled - 対応する構造梁の設定が優先しない場合、固定リンクが形成されます。
  • AnalyticalRigidLinksOption.Disabled - 対応する構造梁の設定が優先しない場合、固定リンクが形成されません。
注: 固定リンクを作成するためには、正しい値を設定する以外に、要素が重なっている必要があります。

図 159: RigidLink

位置合わせ、投影、延長

サブクラス AnalyticalModelSurface、AnalyticalModelStick、AnalyticalModelColumn は特殊なメンバーを持っており、構造要素の位置合わせ、投影、延長のチェックと操作をサポートします。次のコード サンプルは、AnalyticalModelSurface または AnalyticalModelStick の投影を変更する方法を示しています。
コード領域: AnalyticalModelStick 投影を変更
public void ChangeBeamProjection(FamilyInstance familyInstance)
{
    AnalyticalModelStick ams = familyInstance.GetAnalyticalModel() as AnalyticalModelStick;
    if (ams != null)
    {
        // Change the Z projection for the end of the beam
        StickElementProjectionZ orgEndProj = ams.GetProjectionZ(AnalyticalElementSelector.EndOrTop);
        StickElementProjectionZ newEndProj = StickElementProjectionZ.Bottom;
        using (Transaction tran = new Transaction(familyInstance.Document, "ChangeProjection"))
        {
            tran.Start();
            ams.SetProjection(AnalyticalElementSelector.EndOrTop, ElementId.InvalidElementId, newEndProj);
            tran.Commit();
        }

        TaskDialog.Show("AnalyticalModelStick", "AnalyticalModelStick ID: " + ams.Id + "; \nOriginal ProjectionZ value was: " + orgEndProj + "; \nNew ProjectionZ value: " + newEndProj);
    }
}
コード領域: AnalyticalModelSurface 投影を変更
/// <summary>
/// Change the Z projection for all surface elements to BottomOrExterior
/// </summary>
public void ChangeSurfaceProjections(Document document)
{
    FilteredElementCollector collector = new FilteredElementCollector(document);
    IList<Element> elements = collector.WherePasses(new ElementClassFilter(typeof(AnalyticalModelSurface))).WhereElementIsNotElementType().ToElements();
    if (elements.Count > 0)
    {
        using (Transaction tran = new Transaction(document, "Change Surface Projections"))
        {
            tran.Start();
            foreach (AnalyticalModelSurface ams in elements)
            {
                SurfaceElementProjectionZ orgEndProj = ams.ProjectionZ;
                SurfaceElementProjectionZ newEndProj = SurfaceElementProjectionZ.BottomOrExterior;
                ams.ProjectionZ = newEndProj;
            }
            tran.Commit();
        }
    }
}
次の例では、柱の上部の延長の設定を紹介しています。
コード領域: 柱の TopExtension を設定
/// <summary>
/// Change the top extension for the column to Reference Level
/// </summary>
public void ChangeColumnTopExtension(FamilyInstance column)
{
    AnalyticalModelColumn amc = column.GetAnalyticalModel() as AnalyticalModelColumn;
    if (amc != null)
    {
        using (Transaction tran = new Transaction(column.Document, "Change Top Extension"))
        {
            tran.Start();

            StickElementExtension orgTopExt = amc.TopExtension;
            StickElementExtension newTopExt = StickElementExtension.ReferenceLevel;
            amc.TopExtension = newTopExt;

            TaskDialog.Show("AnalyticalModelColumn", "AnalyticalModelColumn ID: " + amc.Id + "; \nOriginal TopExtension value was: " + orgTopExt + "; \nNew TopExtension value: " + newTopExt);

            tran.Commit();
        }
    }
}

近似

AnalyticalModel が直線ではなく曲線で定義されている場合(曲り梁など)、直線で構成される近似を使用すると便利な場合があります。AnalyticalModel には曲線近似に関連するいくつかのメソッドがあります。CanApproximate()が true を返す場合、Approximate()メソッドを使用して近似化していない(曲線の)解析モデルと近似化した(線分のみで作成された)解析モデルを切り替えることができます。近似化されたモデルに切り替えたら、GetCurves()を使用して、近似化された曲線の線分を取得します。

近似は、近似偏差値(GetApproximationDeviation())と[ハードポイントを使用]パラメータ(UsesHardPoints())に基づきます。これらの値には対応する設定メソッドもあります。近似偏差は、滑らかな曲線と、近似によって生成された線分セグメントとの距離を制限します。ハード ポイントは、曲線梁上の位置であり、その他の構造要素が接触しています。このパラメータを true に設定すると、セグメント化された解析モデルには、曲線梁にアタッチされている部材の両端に節点が強制的に配置されます。

AnalyzeAs

AnalyticalModel を介して[解析の対象]パラメータを取得、設定できます。このパラメータは、要素の解析方法や要素が NotForAnalysis であるかどうかを解析プログラムに指示します。GetAnalyzeAs()や SetAnalyzeAs()が使用する AnalyzeAs enum は異なるタイプの要素に使用される enum 値を含むため、すべての解析モデルにすべての値が適用できるわけではありません。特定の値が解析モデルに適用可能であるかを判断するには、IsAnalyzeAsValid()メソッドを使用します。

手動調整

構造部材解析モデルのジオメトリも、結合先の要素に合わせて調整されます(SupportsManualAdjustment()メソッドが true を返すと仮定)。別の要素に合わせて解析モデルを調整するには、AnalyticalModel.ManuallyAdjust()メソッドを使用します。

コード領域 29-14: 別の要素に合わせて解析モデルを調整

// Pick the source analytical line to adjust to
Selection sel = app.ActiveUIDocument.Selection;
Reference refAnalytical = sel.PickObject(ObjectType.Element, "Please Pick the source analytical line to adjust to");
AnalyticalModel aModel = doc.GetElement(refAnalytical) as AnalyticalModel;
Curve aCurve = aModel.GetCurve();
           
// Get the reference of the start point
AnalyticalModelSelector aSelector = new AnalyticalModelSelector(aCurve);
aSelector.CurveSelector = AnalyticalCurveSelector.StartPoint;
Reference refSource = aModel.GetReference(aSelector);
 
// Pick the source analytical line to be adjusted
Reference refAnalytical2 = sel.PickObject(ObjectType.Element, "Please pick the source analytical line to be adjusted");
AnalyticalModel aModel2 = doc.GetElement(refAnalytical2) as AnalyticalModel;
 
// Get the reference of the start point
Curve aCurve2 = aModel2.GetCurve();
AnalyticalModelSelector aSelector2 = new AnalyticalModelSelector(aCurve2);
aSelector2.CurveSelector = AnalyticalCurveSelector.StartPoint;
// Can be adjusted to the middle of the line if WholeCurve is used
Reference refTarget = aModel2.GetReference(aSelector2);
 
// Adjust the analytical line
aModel.ManuallyAdjust(refSource, refTarget, true);

AnalyticalModel には、対応する構造モデルに対して、解析モデルを手動で調整したかどうかを判断するメソッドや、元の位置にリセットするメソッドがあります。さらに、GetManualAdjustmentMatchedElements()メソッドは、解析モデルの調整先の要素 ID の集合を取得します。

解析のオフセット

解析モデルの調整には、オフセットを使用する方法もあります。解析のオフセットの設定は、解析モデルの手動による調整とは異なります。解析のオフセットは、解析モデル全体に適用される基本のオフセットであり、他の要素には依存しません。AnalyticalModel には、解析のオフセットを取得、設定するメソッドの他、解析のオフセットが変更可能かどうかを判断するためのメソッド(CanSetAnalyticalOffset())もあります。

AnalyticalModelSupport

AnalyticalModel には、解析モデルが完全にサポートされるかどうかを判断するための IsElementFullySupported()メソッドがあります。解析モデルのサポートに関する追加情報として、GetAnalyticalModelSupports()メソッドは AnalyticalModelSupport オブジェクトの集合を取得します。このオブジェクトは、各サポート(複数の要素がサポートする場合)の優先度、サポートを提供する点、曲線、面といった、他の構造要素による要素のサポート方法に関する情報を提供します。次の例は、異なる条件での AnalyticalModelSupport オブジェクトの使用方法を表しています。

床と StructuralBeam のサポート情報

スケッチ モードでスラブを描画する場合は、デザイン バーの[支持を選択]をクリックします。次の図に示すように、スラブには 3 つの支持梁があります。スラブの AnalyticalModelSupports の集合を反復して、3 つの梁と CurveSupport AnalyticalSupportType を取得します。

図 160: 床と StructuralBeam のサポート情報

床と壁のサポート情報

支持として壁を選択してスラブを描画すると、床の AnalyticalModelSupport 集合から壁を取得できません。代わりに、AnalyticalModelSupports の壁の集合で床を使用できます。

図 161: 床と壁のサポート情報

構造柱、梁、ブレースのサポート情報

次の図の水平梁には 3 つの PointSupports (2 つの構造柱と 1 つの構造ブレース)があります。ブレースには 3 つの PointSupports (2 つの構造柱と 1 つの構造梁)があります。どちらの柱にも支持要素はありません。

図 162: StructuralElements のサポート情報

BeamSystem と壁のサポート情報

BeamSystem を描画するときには壁を支持として選択できますが、BeamSystem には AnalyticalModel プロパティがないため、サポート情報を直接利用できません。解決方法として、GetBeamIds()メソッドを呼び出し、梁の AnalyticalModelSupport の集合を取得します。

図 163: BeamSystem と壁のサポート情報

ContFooting と壁のサポート情報

連続基礎を持つ壁の場合、壁には ContFooting を使用可能な CurveSupport があります。AnalyticalModel.GetCurves()メソッドを使用すると、サポート曲線を使用できます。次の例には、曲線に 2 つの円弧があります。

図 164: ContFooting と壁のサポート情報

独立基礎と StructuralColumn のサポート情報

構造柱は、PointSupport として独立基礎を持つことができます。この条件では、サポートされた構造柱を使用して基礎を移動できます。OST_StructuralFoundation カテゴリでの FamilyInstance の ElementId は AnalyticalModelSupport.GetSupportingElement() メソッドで使用できます。一般的に、サポート点は AnalyticalModel.GetCurve()メソッドで取得した曲線の下側の点です。これは、GetPoint()メソッドで取得可能な独立基礎 FamilyInstance と AnalyticalModel 点を取得した後でも使用できます。

図 165: 独立基礎(FamilyInstance)と構造柱のサポート情報