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;