Revit Structure では、解析モデルは、構造モデルの技術的な概念を表します。
次の構造要素は構造部材解析モデルを持ちます。
要素の AnalyticalModel は GetAnalyticalModel()メソッドを使用して取得できます。新しく作成された構造要素の AnalyticalModel は再生成を実行するまで使用できません。要素のファミリによっては、AnalyticalModel が存在しない場合があります。AnalyticalModel 値を要素のファミリに適用しない場合、GetAnalyticalModel()メソッドは null を返します。このクラスを使用する前に、値をチェックします。AnalyticalModel は次の情報で構成されています。
特定のオプションは専用クラスで使用できます。
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; } |
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(); } } } |
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(); } } } |
複数の曲線で定義される AnalyticalModel の曲線を取得するには、このメソッドが必要ですが、あらゆる場合に使用可能です。AnalyticalModel が 1 つの曲線で表現される場合、このメソッドは 1 つの曲線のみを含むリストを返します。AnalyticalModel が 1 つの点で表現される場合、このメソッドは点を含む長さがほぼ 0 の曲線を返します。このメソッドは、パラメータとして AnalyticalCurveType enum を使用します。有効な値は次のとおりです。
固定リンクに関する次の値も使用できます。詳細については、この章で後述する「固定リンク」セクションを参照してください。
次の例は、構造壁に対して 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 プロパティには次の値を設定できます。
構造柱の場合、RigidLinksOption プロパティには次の値を設定できます。
図 159: RigidLink
コード領域: 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 に設定すると、セグメント化された解析モデルには、曲線梁にアタッチされている部材の両端に節点が強制的に配置されます。
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())もあります。
AnalyticalModel には、解析モデルが完全にサポートされるかどうかを判断するための IsElementFullySupported()メソッドがあります。解析モデルのサポートに関する追加情報として、GetAnalyticalModelSupports()メソッドは AnalyticalModelSupport オブジェクトの集合を取得します。このオブジェクトは、各サポート(複数の要素がサポートする場合)の優先度、サポートを提供する点、曲線、面といった、他の構造要素による要素のサポート方法に関する情報を提供します。次の例は、異なる条件での AnalyticalModelSupport オブジェクトの使用方法を表しています。
スケッチ モードでスラブを描画する場合は、デザイン バーの[支持を選択]をクリックします。次の図に示すように、スラブには 3 つの支持梁があります。スラブの AnalyticalModelSupports の集合を反復して、3 つの梁と CurveSupport AnalyticalSupportType を取得します。
図 160: 床と StructuralBeam のサポート情報
支持として壁を選択してスラブを描画すると、床の AnalyticalModelSupport 集合から壁を取得できません。代わりに、AnalyticalModelSupports の壁の集合で床を使用できます。
図 161: 床と壁のサポート情報
次の図の水平梁には 3 つの PointSupports (2 つの構造柱と 1 つの構造ブレース)があります。ブレースには 3 つの PointSupports (2 つの構造柱と 1 つの構造梁)があります。どちらの柱にも支持要素はありません。
図 162: StructuralElements のサポート情報
BeamSystem を描画するときには壁を支持として選択できますが、BeamSystem には AnalyticalModel プロパティがないため、サポート情報を直接利用できません。解決方法として、GetBeamIds()メソッドを呼び出し、梁の AnalyticalModelSupport の集合を取得します。
図 163: BeamSystem と壁のサポート情報
連続基礎を持つ壁の場合、壁には ContFooting を使用可能な CurveSupport があります。AnalyticalModel.GetCurves()メソッドを使用すると、サポート曲線を使用できます。次の例には、曲線に 2 つの円弧があります。
図 164: ContFooting と壁のサポート情報
構造柱は、PointSupport として独立基礎を持つことができます。この条件では、サポートされた構造柱を使用して基礎を移動できます。OST_StructuralFoundation カテゴリでの FamilyInstance の ElementId は AnalyticalModelSupport.GetSupportingElement() メソッドで使用できます。一般的に、サポート点は AnalyticalModel.GetCurve()メソッドで取得した曲線の下側の点です。これは、GetPoint()メソッドで取得可能な独立基礎 FamilyInstance と AnalyticalModel 点を取得した後でも使用できます。
図 165: 独立基礎(FamilyInstance)と構造柱のサポート情報