単位

単位

Revit API には、単位を使用して作業するための、2 つのメイン クラス、Units と FormatOptions があります。Units クラスは、単位を文字列として付ける数字の書式設定を行うための、ドキュメントの既定設定を表します。これには、各単位タイプの FormatOptions オブジェクト、および小数点記号や桁区切りに関する設定も含まれています。

Units クラスは、有効な各単位タイプの FormatOptions オブジェクトを格納しますが、それらすべてを直接変更できるわけではありません。UT_Number や UT_SiteAngle など一部には、固定の定義があります。他には、自動的に他の単位タイプから作成された定義があります。たとえば、UT_SheetLength は、UT_Length から作成し、UT_ForceScale は UT_Force から作成します。

FormatOptions クラスには、単位を文字列として使用して数字を書式設定する方法をコントロールする設定が含まれています。これには、通常、[形式]ダイアログ ボックスでエンドユーザによって選択され、丸め、精度、表示単位、およびスペース、先頭ゼロ、末尾ゼロを省略するかどうかの設定など、ドキュメントに保存される設定が含まれています。

FormatOptions クラスは、2 つの異なる方法で使用されます。Units クラスの FormatOptions オブジェクトは、ドキュメントの既定の設定を表します。他で使用される FormatOptions オブジェクトは、必要に応じて既定の設定に優先する可能性のある設定を表します。

UseDefault プロパティは、FormatOptions オブジェクトが既定またはカスタム書式を表すかどうかをコントロールします。UseDefault が true の場合、書式は Units クラスの既定の設定に従ったものになり、オブジェクトの他の設定は無効になります。UseDefault が false の場合、オブジェクトには Units クラスの既定の設定を優先するカスタム設定が含まれます。UseDefault は、Units クラスの FormatOptions オブジェクトの場合は常に false です。

Revit API の重要な単位関係の列挙には次が含まれます。

単位変換

Revit API は、Revit で数量を使用した作業が容易になるユーティリティ クラスを提供します。UnitUtils クラスは、単位のデータと Revit の内部単位を簡単に相互変換できます。

Revit には 7 つの基本量があり、それぞれに内部単位を持っています。これらの内部単位を次の表に示します。

表 9: Revit の単位系の 7 つの基本単位

基本単位

Revit の単位

単位系

長さ

フィート(ft)

インチ/フィート単位

角度

ラジアン

メートル単位

マス

キログラム(kg)

メートル単位

時刻

秒(s)

メートル単位

電流

アンペア(A)

メートル単位

温度

ケルビン(K)

メートル単位

光度

カンデラ(cd)

メートル単位

注: Revit は長さをフィート単位で、他の基本量をメートル単位で格納するため、長さに含まれる作成単位は、インチ/フィート単位とメートル単位の両方に基づく非標準の単位になります。たとえば、力は「質量 - 長さ毎時平方」で測定されるため、kg-ft / s2 で格納されます。次の例では、UnitUtils.ConvertFromInternalUnits()メソッドを使用して、キップ毎平方インチ単位のマテリアルの最小降伏応力を取得します。

コード領域: Revit の内部単位から変換

double GetYieldStressInKsi(Material material)
{
    double dMinYieldStress = 0;
    // Get the structural asset for the material
    ElementId strucAssetId = material.StructuralAssetId;
    if (strucAssetId != ElementId.InvalidElementId)
    {
        PropertySetElement pse = material.Document.GetElement(strucAssetId) as PropertySetElement;
        if (pse != null)
        {
            StructuralAsset asset = pse.GetStructuralAsset();

            // Get the min yield stress and convert to ksi
            dMinYieldStress = asset.MinimumYieldStress;
            dMinYieldStress = UnitUtils.ConvertFromInternalUnits(dMinYieldStress,
                DisplayUnitType.DUT_KIPS_PER_SQUARE_INCH);
        }
    }

    return dMinYieldStress;
}

また、UnitUtils を使用すると、平方フィートから平方メートルなど、ある単位タイプから別の単位タイプに値を変換できます。次の例では、インチで入力された壁の上部のオフセット値を、その値を設定する目標単位であるフィートに変換しています。

コード領域: 単位間を変換

void SetTopOffset(Wall wall, double dOffsetInches)
{
    // convert user-defined offset value to feet from inches prior to setting
    double dOffsetFeet = UnitUtils.Convert(dOffsetInches,
                                            DisplayUnitType.DUT_DECIMAL_INCHES,
                                            DisplayUnitType.DUT_DECIMAL_FEET);

    Parameter paramTopOffset = wall.get_Parameter(BuiltInParameter.WALL_TOP_OFFSET);
    paramTopOffset.Set(dOffsetFeet);
}

単位の書式設定および解析

もう 1 つのユーティリティ クラスである UnitFormatUtils は、データを書式設定したり、書式設定された単位データを解析できます。

オーバーロードされた Format()メソッドを使用して、次の例に示すように[書式]オプションに基づき、値を文字列に書式設定できます。マテリアルの密度が取得され、Format()メソッドを使用した単位で使いやすい値に変換されます。

コード領域: 値を文字列に書式設定

void DisplayDensityOfMaterial(Material material)
{
    double density = 0;
    // get structural asset of material in order to get the density
    ElementId strucAssetId = material.StructuralAssetId;
    if (strucAssetId != ElementId.InvalidElementId)
    {
        PropertySetElement pse = material.Document.GetElement(strucAssetId) as PropertySetElement;
        if (pse != null)
        {
            StructuralAsset asset = pse.GetStructuralAsset();

            density = asset.Density;
            // convert the density value to a user readable string that includes the units
            Units units = material.Document.GetUnits();
            // false for maxAccuracy means accuracy specified by the FormatOptions should be used
            // false for forEditing since this will be for display only and no formatting modifications are necessary
            string strDensity = UnitFormatUtils.Format(units, UnitType.UT_UnitWeight, density, false, false);
            string msg = string.Format("Raw Value: {0}\r\nFormatted Value: {1}", density, strDensity);
            TaskDialog.Show("Material Density", msg);
        }
    }
}

オーバーロードした UnitFormatUtils.TryParse()メソッドは、指定された単位タイプの Revit の内部単位を使用して、単位などの書式設定された文字列を、可能であれば値に解析します。次の例では、数字および長さの単位と考えられるユーザが入力した長さの値を挙げており、長さの値に解析しようとしています。結果はデモンストレーション目的で TaskDialog の入力文字列と比較されます。

コード領域: 解析文字列

double GetLengthInput(Document document, String userInputLength)
{
    double dParsedLength = 0;
    Units units = document.GetUnits();
    // try to parse a user entered string (i.e. 100 mm, 1'6")
    bool parsed = UnitFormatUtils.TryParse(units, UnitType.UT_Length, userInputLength, out dParsedLength);
    if (parsed == true)
    {
        string msg = string.Format("User Input: {0}\r\nParsed value: {1}", userInputLength, dParsedLength);
        TaskDialog.Show("Parsed Data", msg);
    }

    return dParsedLength;
}