IFCファイルを作る/(10)単位を表わす

2001年6月19日作成、2024年1月1日変更
三木(作成時、IAI設備FM分科会に所属)


(注)利用したIFCのバージョンは2.0。以降のバージョンでは差異がある。

◆単位/IfcUnit

「IfcUnit」には、「IfcDerivedUnit」(導かれた単位=組立単位)と「IfcNamedUnit」(名前付けられた単位=固有単位)がある。

TYPE IfcUnit = SELECT (
    IfcDerivedUnit
   ,IfcNamedUnit);
END_TYPE;

「IfcUnit」以下の構造を下記に示す。

IfcUnit(UnitComponent)
├IfcNamedUnit
│├IfcSiUnit
││├IfcDimensionalExponents(Dimensions)
│││├INTEGER(LengthExponent)
│││├INTEGER(MassExponent)
│││├INTEGER(TimeExponent)
│││├INTEGER(ElectricCurrentExponent)
│││├INTEGER(ThermodynamicTemperatureExponent)
│││├INTEGER(AmountOfSubstanceExponent)
│││└INTEGER(LuminousIntensityExponent)
││├IfcUnitEnum(UnitType)
│││└ENUM
││├IfcSiPrefix(Prefix)
│││└ENUM
││└IfcSiUnitName(Name)
││ └ENUM
│├IfcConversionBasedUnit
││├IfcDimensionalExponents(Dimensions)/前述
││├IfcUnitEnum(UnitType)/前述
││├STRING(Name)
││└IfcMeasureWithUnit(ConversionFactor)
│└IfcContextDependentUnit
│ ├IfcDimensionalExponents(Dimensions)/前述
│ ├IfcUnitEnum(UnitType)/前述
│ └STRING(Name)
└IfcDerivedUnit
 ├IfcDerivedUnitElement[](Elements)
 │├IfcNamedUnit(Unit)/前述
 │└INTEGER(Exponent)
 └IfcDerivedUnitEnum(UnitType)
  └ENUM

◆固有単位/IfcNamedUnit

「IfcNamedUnit」は「Dimensions」および「UnitType」の属性を持つ。

ENTITY IfcNamedUnit
  ABSTRACT SUPERTYPE OF (ONEOF(
    IfcContextDependentUnit
   ,IfcConversionBasedUnit
   ,IfcSiUnit));
    Dimensions : IfcDimensionalExponents;
    UnitType   : IfcUnitEnum;
  WHERE
    (略)
END_ENTITY;

DATA;
#10=IFCNAMEDUNIT($,.LENGTHUNIT.);
ENDSEC;

「Dimensions」は「IfcDimensionalExponents」の型のデータを持つ。 「IfcDimensionalExponents」は、長さ、質量、時間、電流、熱力学温度、物質量、光度のそれぞれの要素のべき数を表わす。これらの要素は、SI単位系の基本単位と同じであって、全ての単位の基本となるものである。

ENTITY IfcDimensionalExponents;
    LengthExponent                   : INTEGER;
    MassExponent                     : INTEGER;
    TimeExponent                     : INTEGER;
    ElectricCurrentExponent          : INTEGER;
    ThermodynamicTemperatureExponent : INTEGER;
    AmountOfSubstanceExponent        : INTEGER;
    LuminousIntensityExponent        : INTEGER;
END_ENTITY;

DATA;
#10=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
ENDSEC;

「UnitType」は「IfcUnitEnum」の型のデータを持つ。 ここに、平面角、立体角の要素は、SI単位系の補助単位と同じであって、上記の基本単位とともに、他の単位の基本となるものである。 (コメントは筆者による。)

TYPE IfcUnitEnum = ENUMERATION OF (
    LengthUnit                   /* 長さ        */
   ,MassUnit                     /* 質量        */
   ,TimeUnit                     /* 時間        */
   ,DurationUnit                 /* 期間(年、月、日?) */
   ,ElectricCurrentUnit          /* 電流        */
   ,ThermodynamicTemperatureUnit /* 熱力学温度     */
   ,AmountOfSubstanceUnit        /* 物質量       */
   ,LuminousIntensityUnit        /* 光度        */
   ,PlaneAngleUnit               /* 平面角       */
   ,SolidAngleUnit               /* 立体角       */
   ,AreaUnit                     /* 面積        */
   ,VolumeUnit                   /* 体積        */
   ,RatioUnit                    /* 比率        */
   ,Unspecified);                /* 未記述       */
END_TYPE;

ちなみに、「IfcNamedUnit」は抽象的なクラス(ABSTRACT)であるため、実際のデータは「IfcContextDependentUnit」「IfcConversionBasedUnit」「IfcSiUnit」のいずれかである。「IfcContextDependentUnit」はSI単位系に関係付けられない単位、「IfcConversionBasedUnit」はSI単位系に換算して関連付けられる単位、「IfcSiUnit」はSI単位である。

ENTITY IfcContextDependentUnit
  SUBTYPE OF (IfcNamedUnit);
    Name : STRING;
END_ENTITY;

DATA;
#10=IFCCONTEXTDEPENDENTUNIT($,.LENGTHUNIT.,$);
ENDSEC;

ENTITY IfcConversionBasedUnit
  SUBTYPE OF (IfcNamedUnit);
    Name             : STRING;
    ConversionFactor : IfcMeasureWithUnit;
END_ENTITY;

DATA;
#10=IFCCONVERSIONBASEDUNIT($,.LENGTHUNIT.,$,$);
ENDSEC;

ENTITY IfcSiUnit
  SUBTYPE OF (IfcNamedUnit);
    Prefix : OPTIONAL IfcSiPrefix;
    Name   : IfcSiUnitName;
  DERIVE
    (略)
END_ENTITY;

DATA;
#10=IFCSIUNIT(*,.LENGTHUNIT.,.EXA.,.METRE.);
ENDSEC;

さらに、「IfcSiUnit」は、「IfcSiPrefix」(接頭記号)と「IfcSiUnitName」(SI単位名)から成る。 (コメントは筆者による。)

TYPE IfcSiPrefix = ENUMERATION OF (
    EXA     /* E :10^ 18 */
   ,PETA    /* P :10^ 15 */
   ,TERA    /* T :10^ 12 */
   ,GIGA    /* G :10^  9 */
   ,MEGA    /* M :10^  6 */
   ,KILO    /* k :10^  3 */
   ,HECTO   /* h :10^  2 */
   ,DECA    /* da:10^  1 */
   ,DECI    /* d :10^- 1 */
   ,CENTI   /* c :10^- 2 */
   ,MILLI   /* m :10^- 3 */
   ,MICRO   /* μ:10^- 6 */
   ,NANO    /* n :10^- 9 */
   ,PICO    /* p :10^-12 */
   ,FEMTO   /* f :10^-15 */
   ,ATTO);  /* a :10^-18 */
END_TYPE;

TYPE IfcSiUnitName = ENUMERATION OF (
    METRE          /* m  :メートル  (基本単位) */
   ,SQUARE_METRE   /* m^2:平方メートル(組立単位) */
   ,CUBIC_METRE    /* m^3:立方メートル( 〃  ) */
   ,GRAM           /* g  :グラム   (基本単位) */
   ,SECOND         /* s  :秒     ( 〃  ) */
   ,AMPERE         /* A  :アンペア  ( 〃  ) */
   ,KELVIN         /* K  :ケルビン  ( 〃  ) */
   ,MOLE           /* mol:モル    ( 〃  ) */
   ,CANDELA        /* cd :カンデラ  ( 〃  ) */
   ,RADIAN         /* rad:ラジアン  (補助単位) */
   ,STERADIAN      /* sr :ステラジアン( 〃  ) */
   ,HERTZ          /* Hz :ヘルツ   (固有名称を持つ組立単位) */
   ,NEWTON         /* N  :ニュートン ( 〃  ) */
   ,PASCAL         /* Pa :パスカル  ( 〃  ) */
   ,JOULE          /* J  :ジュール  ( 〃  ) */
   ,WATT           /* W  :ワット   ( 〃  ) */
   ,COULOMB        /* C  :クーロン  ( 〃  ) */
   ,VOLT           /* V  :ボルト   ( 〃  ) */
   ,FARAD          /* F  :ファラド  ( 〃  ) */
   ,OHM            /* Ω :オーム   ( 〃  ) */
   ,SIEMENS        /* S  :ジーメンス ( 〃  ) */
   ,WEBER          /* Wb :ウェーバー ( 〃  ) */
   ,TESLA          /* T  :テスラ   ( 〃  ) */
   ,HENRY          /* H  :ヘンリー  ( 〃  ) */
   ,DEGREE_CELSIUS /* ℃ :セルシウス度( 〃  ) */
   ,LUMEN          /* lm :ルーメン  ( 〃  ) */
   ,LUX            /* lx :ルクス   ( 〃  ) */
   ,BECQUEREL      /* Bq :ベクレル  ( 〃  ) */
   ,GRAY           /* Gy :グレイ   ( 〃  ) */
   ,SIEVERT);      /* Sv :シーベルト ( 〃  ) */
END_TYPE;

◆組立単位/IfcDerivedUnit

「IfcDerivedUnit」は「Elements」および「UnitType」の属性を持つ。

ENTITY IfcDerivedUnit;
    Elements : SET [1:?] OF IfcDerivedUnitElement;
    UnitType : IfcDerivedUnitEnum;
  DERIVE
    (略)
  WHERE
    (略)
END_ENTITY;

DATA;
#10=IFCDERIVEDUNIT((),.ANGULARVELOCITYUNIT.);
ENDSEC;

「Elements」は「IfcDerivedUnitElement」の型のデータの集まりを持つ。 「IfcDerivedUnitElement」は、上記の「IfcNamedUnit」とべき数から成る。 これにより、いくつかの「IfcNamedUnit」を組み合わせる(べき乗の積にする)ことで、任意の単位を作ることができる。

ENTITY IfcDerivedUnitElement;
    Unit     : IfcNamedUnit;
    Exponent : INTEGER;
END_ENTITY;

DATA;
#10=IFCDERIVEDUNITELEMENT($,0);
ENDSEC;

「UnitType」は「IfcDerivedUnitEnum」の型のデータを持つ。 ユーザーによる定義も可能である。 (コメントは筆者による。)

TYPE IfcDerivedUnitEnum = ENUMERATION OF (
    AngularVelocityUnit      /* 角速度      */
   ,DynamicViscosityUnit     /* 粘度       */
   ,ElectricVoltageUnit      /* 電圧       */
   ,EnergyUnit               /* エネルギー    */
   ,HeatfluxDensityUnit      /* 熱流束      */
   ,IntegerCountRateUnit     /* 単位時間当りの数 */
   ,KinematicViscosityUnit   /* 動粘度      */
   ,LinearVelocityUnit       /* 線速度      */
   ,MassDensityUnit          /* 密度       */
   ,MassFlowrateUnit         /* 質量流速     */
   ,PowerUnit                /* 動力       */
   ,PressureUnit             /* 圧力       */
   ,FrequencyUnit            /* 周波数      */
   ,ThermalAdmittanceUnit    /* 熱アドミタンス  */
   ,ThermalResistanceUnit    /* 熱抵抗      */
   ,ThermalTransmittanceUnit /* 熱透過率     */
   ,VolumetricFlowrateUnit   /* 流量       */
   ,UserDefined              /* ユーザー定義   */
   ,NotDefined);             /* 未定義      */
END_TYPE;

◆単位の表現

例えば、[mm]や[m2]は下記による。ここに、「*」は、下位クラスの属性により上位クラスの属性が誘導できる場合に、設定が不要となるものを表わす。

DATA;
#10=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);
#11=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
ENDSEC;

また、[m3/s]は下記による。

DATA;
#10=IFCDERIVEDUNIT((#11,#12),.VOLUMETRICFLOWRATEUNIT.);
#11=IFCDERIVEDUNITELEMENT(#13,1);
#12=IFCDERIVEDUNITELEMENT(#14,-1);
#13=IFCSIUNIT(*,.VOLUMEUNIT.,.$.,.CUBIC_METRE.);
#14=IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.);
ENDSEC;


目次 / /