IFCファイルを作る/(4)部屋の情報を取得する

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


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

◆IfcSpaceの属性

ここまで、IfcSpaceの属性をいくつか扱ったが、ここであらためてこれらの属性についてまとめてみる。IfcSpaceを追加した際のデータを、下記に再掲する。

#10=IFCSPACE($,$,$,$,(),$,(),$,(),.INTERNAL.,$,$,0.,0.,0.,0.,0.,0.,0.);

ここに一番外側の「(」と「)」で囲まれ、「,」で区切られた19個の値がIfcSpaceの属性の値である。これらの名称を下記に示す。

  1. GlobalId
  2. OwnerHistory
  3. Label
  4. UserDefinedType
  5. DocumentReferences
  6. LocalPlacement
  7. Representations
  8. Classification
  9. BoundedBy
  10. InteriorOrExteriorSpace
  11. SpaceReference(部屋番号)
  12. SpaceName(部屋名)
  13. calcTotalPerimeter
  14. calcTotalArea(部屋面積)
  15. calcTotalVolume(部屋容積)
  16. calcAverageHeight
  17. calcAverageGrossHeight
  18. calcAverageClearHeight
  19. calcElevationWithFlooring

◆IfcSpaceの定義

属性の内容は定義を調べるとわかる。IFCの仕様(Release 2.0)においては、IfcSpaceは下記のように定義(Express表記)されている。

ENTITY IfcSpace
  SUPERTYPE OF (ONEOF(
    IfcFireCompartment
   ,IfcWorkstation ))
  SUBTYPE OF (IfcSpatialElement);
    BoundedBy                 : LIST [1:?] OF IfcSpaceBoundary;
    InteriorOrExteriorSpace   : IfcInternalOrExternalEnum;
    SpaceReference            : OPTIONAL STRING;
    SpaceName                 : OPTIONAL STRING;
    calcTotalPerimeter        : OPTIONAL IfcPositiveLengthMeasure;
    calcTotalArea             : OPTIONAL IfcAreaMeasure;
    calcTotalVolume           : OPTIONAL IfcVolumeMeasure;
    calcAverageHeight         : OPTIONAL IfcPositiveLengthMeasure;
    calcAverageGrossHeight    : OPTIONAL IfcPositiveLengthMeasure;
    calcAverageClearHeight    : OPTIONAL IfcPositiveLengthMeasure;
    calcElevationWithFlooring : OPTIONAL IfcLengthMeasure;
  INVERSE
    (略)
  WHERE
    (略)
END_ENTITY;

これによると、IfcSpaceが「IfcFireCompartment」と「IfcWorkstation」の上位クラスであること、また「IfcSpatialElement」の下位クラスであること、さらに「BoundedBy」〜「calcElevationWithFlooring」の属性を持つこと、などがわかる。

また、個々の属性については、例えば「BoundedBy」は「IfcSpaceBoundary」で定義されるデータの1つ以上の集まりであること、「InteriorOrExteriorSpace」は「IfcInternalOrExternalEnum」で定義されるデータであること、「SpaceReference」は「STRING(文字列)」のデータであって「OPTIONAL(必須でない)」であること、などがわかる。

◆IfcSpaceの上位クラス

さて、IfcSpaceの属性は全部で19個あるが、上記で定義されているのは11個であって、残りは上位クラスから継承しているものである。(継承しているのは、「データの入れ物」であって「値」ではない。)上位クラスを辿ると、それぞれ以下のように定義されている。

ENTITY IfcSpatialElement
  ABSTRACT SUPERTYPE OF (ONEOF(
    IfcSpace
   ,IfcSpaceBoundary))
  SUBTYPE OF (IfcProduct);
END_ENTITY;

ENTITY IfcProduct
  ABSTRACT SUPERTYPE OF (ONEOF(
    IfcBuilding
   ,IfcBuildingStorey
   ,IfcConstructionZoneAggregationProduct
   ,IfcElement
   ,IfcSite
   ,IfcSpatialElement ))
  SUBTYPE OF (IfcObject);
    LocalPlacement  : IfcLocalPlacement;
    Representations : SET [0:2] OF IfcProductRepresentation;
    Classification  : OPTIONAL IfcClassificationList;
END_ENTITY;

ENTITY IfcObject
  ABSTRACT SUPERTYPE OF (ONEOF(
    IfcActor
   ,IfcControl
   ,IfcGroup
   ,IfcProcess
   ,IfcProduct
   ,IfcProject
   ,IfcProxy
   ,IfcResource))
  SUBTYPE OF (IfcRoot);
    UserDefinedType    : OPTIONAL STRING;
    DocumentReferences : SET [0:?] OF IfcDocumentReference;
  INVERSE
    (略)
END_ENTITY;

ENTITY IfcRoot
  ABSTRACT SUPERTYPE OF (ONEOF(
    IfcModelingAid
   ,IfcObject
   ,IfcPropertyDefinition
   ,IfcRelationship));
    GlobalId     : IfcGloballyUniqueId;
    OwnerHistory : IfcOwnerHistory;
    Label        : OPTIONAL STRING;
  UNIQUE
    (略)
END_ENTITY;

ここに、IfcRootは全てのエンティティの最上位に位置するものである。IfcRootからの構造とそれぞれの属性を示すと、下記のようになる。

IfcRoot /GlobalId,OwnerHistory,Label
IfcObject /UserDefinedType,DocumentReferences
IfcProduct /LocalPlacement,Representations,Classification
IfcSpatialElement
IfcSpace /BoundedBy,・・・,calcElevationWithFlooring

◆属性の定義

属性の値を取得したり設定したりするには、属性の名前だけでなく、その値の形式についての情報も必要である。値の形式とは、整数、実数、文字列などの区別および単独、集まりの区別をいう。IfcSpaceに関連するこれらの定義の一部を、以下に示す。

ENTITY IfcSpaceBoundary
  SUBTYPE OF (IfcSpatialElement);
    PhysicalOrVirtualBoundary  : IfcPhysicalOrVirtualEnum;
    InternalOrExternalBoundary : IfcInternalOrExternalEnum;
    calcBoundarySurfaceArea    : OPTIONAL IfcAreaMeasure;
  INVERSE
    (略)
  WHERE
    (略)
END_ENTITY;

TYPE IfcPhysicalOrVirtualEnum = ENUMERATION OF (
    Physical
   ,Virtual
   ,NotDefined);
END_TYPE;

TYPE IfcInternalOrExternalEnum = ENUMERATION OF (
    Internal
   ,External
   ,NotDefined);
END_TYPE;

TYPE IfcAreaMeasure = REAL;
END_TYPE;

これによると「IfcSpaceBoundary」が、「PhysicalOrVirtualBoundary」「InternalOrExternalBoundary」「calcBoundarySurfaceArea」の属性を持つ(その他、上位クラスから継承するものもある)ことがわかる。

さらに「PhysicalOrVirtualBoundary」は「IfcPhysicalOrVirtualEnum」のデータを持ち「Physical」「Virtual」「NotDefined」のいずれかであること、同じく「InternalOrExternalBoundary」は「IfcInternalOrExternalEnum」のデータを持ち「Internal」「External」「NotDefined」のいずれかであることがわかる。また「calcBoundarySurfaceArea」は「IfcAreaMeasure」のデータを持ち実数であることがわかる。

◆IfcSpaceの属性の取得

以上をまとめると、IfcSpaceの属性は下記のようになる。IfcSpaceに限らず、全てのエンティティは繋がりを辿ることで、その内容を知ることができる。

属性名形式
GlobalId(グローバルID)文字列[20字固定長]
OwnerHistory(所有者履歴)
Label(ラベル)文字列
UserDefinedType(ユーザー定義型)文字列
DocumentReferences(文書参照)
LocalPlacement(位置)
Representations(表示)
Classification(分類)
BoundedBy(境界)物理的仮想的の区別:「Physical」「Virtual」「NotDefined」のいずれか、屋内屋外の区別:「Internal」「External」「NotDefined」のいずれか、境界表面積:実数、の集まりが1つ以上
InteriorOrExteriorSpace(屋内屋外の区別)「internal」「external」または「NotDefined」
SpaceReference(部屋番号)文字列
SpaceName(部屋名)文字列
calcTotalPerimeter(周囲長さ)実数
calcTotalArea(部屋面積)実数
calcTotalVolume(部屋容積)実数
calcAverageHeight(スラブ下高さ)実数
calcAverageGrossHeight(階高)実数
calcAverageClearHeight
(天井高さ:床仕上面〜天井面)
実数
calcElevationWithFlooring(床仕上高さ)実数

これにより、IfcSpaceの属性の取得ができる。例えば、IfcSpaceの全ての属性のうちIfcSpaceで定義されている「BoundedBy」〜「calcElevationWithFlooring」の属性を取得するのは、下記(just like spaghetti !)による。

'/// IfcSpaceで定義される全てのアトリビュートを取得する ///
'[9]に入れる
Dim objAttribute
Dim txt_sum
txt_sum = ""
Set objAttribute = objAttributes.Item("BoundedBy")
If IsObject(objAttribute) = TRUE Then
  Dim objEntity_new,objAttributes_new,objAttribute_new
  Dim imax,imin,i
  imax = objAttribute.Size
  imin = 1
  For i = imin To imax

    Set objEntity_new = objAttribute.GetItem(i) 'i番目のIfcSpaceBoundary
    If IsObject(objEntity_new) = TRUE Then
      Set objAttributes_new = objEntity_new.Attributes
      If IsObject(objAttributes_new) = TRUE Then

        Set objAttribute_new = objAttributes_new.Item("PhysicalOrVirtualBoundary")
        If IsObject(objAttribute_new) = TRUE Then
          txt_sum = txt_sum & "/境界(" & CStr(i) & ")の"
          txt_sum = txt_sum & "物理的仮想的の区別:" & objAttribute_new.Value
          Set objAttribute_new = Nothing
        End If
        Set objAttribute_new = objAttributes_new.Item("InternalOrExternalBoundary")
        If IsObject(objAttribute_new) = TRUE Then
          txt_sum = txt_sum & "/境界(" & CStr(i) & ")の"
          txt_sum = txt_sum & "屋内屋外の区別:" & objAttribute_new.Value
          Set objAttribute_new = Nothing
        End If
        Set objAttribute_new = objAttributes_new.Item("calcBoundarySurfaceArea")
        If IsObject(objAttribute_new) = TRUE Then
          txt_sum = txt_sum & "/境界(" & CStr(i) & ")の"
          txt_sum = txt_sum & "境界表面積:" & CStr(objAttribute_new.Value)
          Set objAttribute_new = Nothing
        End If

        Set objAttributes_new = Nothing
      End If
      Set objEntity_new = Nothing
    End If

  Next
  Set objAttribute = Nothing
End If

Set objAttribute = objAttributes.Item("InteriorOrExteriorSpace")
If IsObject(objAttribute) = TRUE Then
  txt_sum = txt_sum & "/屋内屋外の区別:" & objAttribute.Value
  Set objAttribute = Nothing
End If
Set objAttribute = objAttributes.Item("SpaceReference")
If IsObject(objAttribute) = TRUE Then
  txt_sum = txt_sum & "/部屋番号:" & objAttribute.Value
  Set objAttribute = Nothing
End If
Set objAttribute = objAttributes.Item("SpaceName")
If IsObject(objAttribute) = TRUE Then
  txt_sum = txt_sum & "/部屋名:" & objAttribute.Value
  Set objAttribute = Nothing
End If
Set objAttribute = objAttributes.Item("calcTotalPerimeter")
If IsObject(objAttribute) = TRUE Then
  txt_sum = txt_sum & "/周囲長さ:" & CStr(objAttribute.Value)
  Set objAttribute = Nothing
End If
Set objAttribute = objAttributes.Item("calcTotalArea")
If IsObject(objAttribute) = TRUE Then
  txt_sum = txt_sum & "/部屋面積:" & CStr(objAttribute.Value)
  Set objAttribute = Nothing
End If
Set objAttribute = objAttributes.Item("calcTotalVolume")
If IsObject(objAttribute) = TRUE Then
  txt_sum = txt_sum & "/部屋容積:" & CStr(objAttribute.Value)
  Set objAttribute = Nothing
End If
Set objAttribute = objAttributes.Item("calcAverageHeight")
If IsObject(objAttribute) = TRUE Then
  txt_sum = txt_sum & "/スラブ下高さ:" & CStr(objAttribute.Value)
  Set objAttribute = Nothing
End If
Set objAttribute = objAttributes.Item("calcAverageGrossHeight")
If IsObject(objAttribute) = TRUE Then
  txt_sum = txt_sum & "/階高:" & CStr(objAttribute.Value)
  Set objAttribute = Nothing
End If
Set objAttribute = objAttributes.Item("calcAverageClearHeight")
If IsObject(objAttribute) = TRUE Then
  txt_sum = txt_sum & "/天井高さ:" & CStr(objAttribute.Value)
  Set objAttribute = Nothing
End If
Set objAttribute = objAttributes.Item("calcElevationWithFlooring")
If IsObject(objAttribute) = TRUE Then
  txt_sum = txt_sum & "/床仕上高さ:" & CStr(objAttribute.Value)
  Set objAttribute = Nothing
End If
MsgBox txt_sum

サンプルデータと実行結果を下記に示す。

DATA;
#10=IFCSPACE($,$,$,$,(),$,(),$,(#11,#12,#13,#14),.INTERNAL.,'R1',
'Office Room',50.,100.,250.,3.3,3.5,2.5,0.05);
#11=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.EXTERNAL.,20.);
#12=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.EXTERNAL.,5.);
#13=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.INTERNAL.,20.);
#14=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.INTERNAL.,5.);
ENDSEC;

IfcSpaceの属性


目次 / /