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());
}
}
|
オーバーロードした GetLocalCoordinateSystem()メソッドを呼び出すと、AnalyticalModelStick と AnalyticalModelSurface 要素のローカル座標系の向きを変換として取得できます。AnalyticalModelSurface の場合、パラメータを使用しないこのメソッドのオーバーロードではモデル全体のローカル座標系の向きの変換が返されますが、XYZ 点を使用するオーバーロードの場合はサーフェス上の特定の点におけるローカル座標系を示す変換が返されます。指定する点は解析モデルのサーフェス上の点である必要があります。サーフェス上にない場合は Revit から例外がスローされます。
AnalyticalModelStick クラスで GetLocalCoordinateSystem()を呼び出す場合、GetLocalCoordinateSystem(ダブル値)を呼び出して 0 から 1 (例: 0.5 はパラメータ化された曲線に沿う中間点の位置を表します)の間のパラメータで表される曲線に沿った距離を渡すこともできます。さらに、指定する点が解析 model.Face.Evaluate に沿った点である場合は、AnalyticalModelSurface で呼び出したときと同じ拘束で GetLocalCoordinateSystem(XYZ 点)を呼び出すこともできます。それ以外の場合は、Curve.Evaluate を使用してサーフェス上にある、または曲線に沿った XYZ 点を取得します。
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 と壁のサポート情報
布基礎を持つ壁の場合、壁には WallFoundation を使用可能な CurveSupport があります。AnalyticalModel.GetCurves()メソッドを使用すると、サポート曲線を使用できます。次の例には、曲線に 2 つの円弧があります。
図 164: WallFoundation と壁のサポート情報
構造柱は、PointSupport として独立基礎を持つことができます。この条件では、サポートされた構造柱を使用して基礎を移動できます。OST_StructuralFoundation カテゴリでの FamilyInstance の ElementId は AnalyticalModelSupport.GetSupportingElement() メソッドで使用できます。一般的に、サポート点は AnalyticalModel.GetCurve()メソッドで取得した曲線の下側の点です。これは、GetPoint()メソッドで取得可能な独立基礎 FamilyInstance と AnalyticalModel 点を取得した後でも使用できます。
図 165: 独立基礎(FamilyInstance)と構造柱のサポート情報
AnalyticalModelStick クラスでは、スティック要素のそれぞれの端点に 6 つの内力を格納できます。それぞれの端点には、3 つの並進荷重と 3 つの回転(モーメント)荷重を格納できます。これらの部材荷重は、モデルに対する特定の一連の荷重の結果を表したり、接続設計で使用される設計荷重を表したりします。荷重ケースや組み合わせには関連性がありません。部材荷重は、解析スティック モデル(梁、ブレース、柱で使用)の UI の Member Forces プロパティに対応します。
これらの荷重は MemberForces クラスで表されます。このクラスは 6 つのすべての荷重コンポーネント(3 つの荷重、3 つのモーメント)を取得、設定するためのアクセスを提供し、Start プロパティを使用して、オブジェクトが部材の始端の荷重と終端の荷重のどちらを表すかを示します。true に設定すると始端の荷重、false の場合は終端の荷重になります。
始端と終端の荷重とモーメントは、荷重またはモーメントのコンポーネント値で構成される XYZ ベクトルとして格納されます。たとえば、Forces.X は X 方向に作用する荷重の値を表します。
メソッド AnalyticalModelStick.GetMemberForces()を呼び出すことで、解析モデルに格納されている部材荷重にアクセスできます。このメソッドは MemberForces オブジェクトのリストを返しますが、最小数は 0 で最大数は 2 (各端に1つずつ)になります。部材に部材荷重がない場合はリストは空になり、一方の端点にのみ荷重が指定されている場合は、リストに含まれる MemberForces オブジェクトは 1 つだけになります。UI で「リリース」に設定されている、または AnalyticalModelStick.SetReleases()で true (リリース)に設定されている荷重やモーメントの向きは、AnalyticalModleStick.GetMemberForces()で照会すると 0.0 として報告されます。(リリースされた荷重やモーメントは、リリースされたこれらの方向の荷重やモーメントに抵抗できません)。
部材荷重を AnalyticalModelStick で設定するには、オーバーロードした SetMemberForces()メソッドのいずれかを呼び出します。SetMemberForces()は、既存の部材荷重を新たに指定した部材荷重で上書きします。
現在リリースされている荷重やモーメントの方向の場合、UI と AnalyticalModelStick.GetMemberForces()の両方が 0 を返します。ただし、AnalyticalModelStick.SetMemberForces()メソッドを使用して設定すると、ユーザがリリースを後で消去したり、AnalyticalModelStick.SetReleases()を使用して消去したりした場合に、前に設定した値が報告されるように荷重やモーメントの方向が保持されます。
AnalyticalModelSticks の部材荷重は両端の荷重を一度に削除することも、片方の端点の荷重のみを削除することもできます。要素のすべての部材荷重を削除するには、AnalyticalModelStick.RemoveAllMemberForces()を呼び出します。始端または終端のどちらか一方の部材荷重を削除するには、AnalyticalModelStick.RemoveMemberForces()を呼び出し、削除する方の端点を指定します。