IFCファイルを作る/(6)プロパティセットを取得する

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


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

◆プロパティセット/IfcPropertySet

本来、全ての属性はクラスで定義されるべきである。 しかし、現実には、クラスで定義されていない属性もあり、しかも、それが必要な場合がある。 その解決策として便宜的に利用される属性の入れ物が、プロパティ(特性)のセット(集まり)すなわちプロパティセットである。 実際に「IfcPropertySet」を作成すると下記のようになる。5個の属性を持つ。

'/// プロパティセットのエンティティを追加 ///
'[2]または[3]に入れる
Dim objEntity
Set objEntity = objDesign.Add("IfcPropertySet")
If IsObject(objEntity) = TRUE Then
  Set objEntity = Nothing
End If
objDesign.save()

DATA;
#10=IFCPROPERTYSET($,$,$,$,());
ENDSEC;

◆IfcPropertySetの定義

「IfcPropertySet」は「IfcPropertyDefinition」の下位クラスであって、「Name」と「HasProperties」の2個の属性を持ち、「Name」は文字列のデータを、また「HasProperties」は1個以上の「IfcProperty」のデータをそれぞれ持つ。

ENTITY IfcPropertySet
  SUPERTYPE OF (ONEOF(
    IfcExtensionPropertySet))
  SUBTYPE OF (IfcPropertyDefinition);
    Name          : STRING;
    HasProperties : LIST [1:?] OF IfcProperty;
END_ENTITY;

「IfcPropertyDefinition」は「IfcRoot」の下位クラスであって、それ自体は属性を持たない。

ENTITY IfcPropertyDefinition
  ABSTRACT SUPERTYPE OF (ONEOF(
    IfcPropertySet
   ,IfcElectricalCharacteristics
   ,IfcManufactureInformation
   ,IfcMetricValue
   ,IfcOccupancyNumber
   ,IfcSpaceUseCase ))
  SUBTYPE OF (IfcRoot);
  INVERSE
    (略)
END_ENTITY;

一方「IfcRoot」は3個の属性を持つ。これが継承されて「IfcPropertySet」の属性が5個になっている。

IfcRoot /GlobalId,OwnerHistory,Label
IfcPropertyDefinition
IfcPropertySet /Name,HasProperties

◆IfcPropertyの定義

「IfcProperty」は「Name」という属性を持ち、「Name」は文字列のデータを持つ。

ENTITY IfcProperty
  ABSTRACT SUPERTYPE OF (ONEOF(
    IfcEnumeratedProperty
   ,IfcLibraryReference
   ,IfcObjectReference
   ,IfcPropertyList
   ,IfcSimpleProperty
   ,IfcSimplePropertyWithUnit));
    Name : STRING;
  INVERSE
    (略)
END_ENTITY;

「IfcProperty」は抽象的なクラス(ABSTRACT)であるため、実際には、下位クラスのいずれかである。

ENTITY IfcEnumeratedProperty
  SUBTYPE OF (IfcProperty);
    EnumerationIndex     : INTEGER;
    EnumerationReference : IfcEnumeration;
END_ENTITY;

ENTITY IfcLibraryReference
  SUBTYPE OF (IfcProperty);
    ReferencedLibrary : IfcLibrary;
    ReferencedItem    : OPTIONAL STRING;
END_ENTITY;

ENTITY IfcObjectReference
  SUBTYPE OF (IfcProperty);
    ObjectReference : IfcObjectReferenceSelect;
END_ENTITY;

ENTITY IfcPropertyList
  SUBTYPE OF (IfcProperty);
    UserMin       : OPTIONAL INTEGER;
    Max           : OPTIONAL INTEGER;
    HasProperties : LIST [Min:Max] OF UNIQUE IfcProperty;
  DERIVE
    (略)
  WHERE
    (略)
END_ENTITY;

ENTITY IfcSimpleProperty
  SUBTYPE OF (IfcProperty);
    ValueComponent : IfcMeasureValue;
END_ENTITY;

ENTITY IfcSimplePropertyWithUnit
  SUBTYPE OF (IfcProperty);
    ValueWithUnit : IfcMeasureWithUnit;
END_ENTITY;

例えば「IfcSimpleProperty」の場合には、「ValueComponent」という属性を持ち、「ValueComponent」は「IfcMeasureValue」のデータを持つ。

さらに「IfcMeasureValue」は、「IfcAmountOfSubstanceMeasure」〜「IfcVolumetricFlowrateMeasure」のいずれかであり、また、これらは、実数、整数、自然数、ブール値、文字列のいずれかである。(コメントは筆者による。)

TYPE IfcMeasureValue = SELECT (
    IfcAmountOfSubstanceMeasure        /* 実数 */
   ,IfcAngularVelocityMeasure          /* 実数 */
   ,IfcAreaMeasure                     /* 実数 */
   ,IfcBoolean                         /* ブール値 */
   ,IfcCompoundPlaneAngleMeasure       /* 0〜360、0〜60、0〜60の3個の整数 */
   ,IfcContextDependentMeasure         /* 実数 */
   ,IfcCountMeasure                    /* 自然数 */
   ,IfcDescriptiveMeasure              /* 文字列 */
   ,IfcDynamicViscosityMeasure         /* 実数 */
   ,IfcElectricCurrentMeasure          /* 実数 */
   ,IfcElectricVoltageMeasure          /* 実数 */
   ,IfcEnergyMeasure                   /* 実数 */
   ,IfcHeatFluxDensityMeasure          /* 実数 */
   ,IfcInteger                         /* 整数 */
   ,IfcIntegerCountRateMeasure         /* 実数 */
   ,IfcKinematicViscosityMeasure       /* 実数 */
   ,IfcLengthMeasure                   /* 実数 */
   ,IfcLinearVelocityMeasure           /* 実数 */
   ,IfcLuminousIntensityMeasure        /* 実数 */
   ,IfcMassDensityMeasure              /* 実数 */
   ,IfcMassFlowRateMeasure             /* 実数 */
   ,IfcMassMeasure                     /* 実数 */
   ,IfcMonetaryMeasure                 /* 実数 */
   ,IfcNumericMeasure                  /* 自然数 */
   ,IfcParameterValue                  /* 実数 */
   ,IfcPlaneAngleMeasure               /* 実数 */
   ,IfcPositiveLengthMeasure           /* 正の実数 */
   ,IfcPositivePlaneAngleMeasure       /* 正の実数 */
   ,IfcPositiveRatioMeasure            /* 正の実数 */
   ,IfcPowerMeasure                    /* 実数 */
   ,IfcPressureMeasure                 /* 実数 */
   ,IfcRatioMeasure                    /* 実数 */
   ,IfcReal                            /* 実数 */
   ,IfcFrequencyMeasure                /* 実数 */
   ,IfcSolidAngleMeasure               /* 実数 */
   ,IfcString                          /* 文字列 */
   ,IfcThermalAdmittanceMeasure        /* 実数 */
   ,IfcThermalResistanceMeasure        /* 実数 */
   ,IfcThermalTransmittanceMeasure     /* 実数 */
   ,IfcThermodynamicTemperatureMeasure /* 実数 */
   ,IfcTimeMeasure                     /* 実数 */
   ,IfcTimeStamp                       /* 整数 */
   ,IfcVolumeMeasure                   /* 実数 */
   ,IfcVolumetricFlowrateMeasure);     /* 実数 */
END_TYPE;

◆IfcPropertySetの取得

以上により、「IfcPropertySet」を取得するには、下記による。

'/// プロパティセットの集合を取得 ///
'[3]に入れる
Dim objEntitiesPS
Dim objEntityPS
Set objEntitiesPS = objDesign.FindObjects("IfcPropatySet")
If IsObject(objEntitiesPS) = TRUE Then
  For Each objEntityPS In objEntitiesPS
    If IsObject(objEntityPS) = TRUE Then
'     処理[10]
      Set objEntityPS = Nothing
    End If
  Next
  Set objEntitesPS = Nothing
End If

'/// プロパティセットを取得 ///
'[10]に入れる
Dim objAttributesPS
Dim objEntityP
Dim objAttributesP
Dim txt_sum
Dim kmax,kmin,k
Set objAttributesPS = objEntityPS.Attributes
If IsObject(objAttributesPS) = TRUE Then
  txt_sum = ""
  txt_sum = txt_sum & "/プロパティセットの名前:" & objAttributesPS("Name").Value
  kmax = objAttributesPS("HasProperties").Size
  kmin = 1
  For k = kmin To kmax
    Set objEntityP = objAttributesPS("HasProperties").GetItem(k)
    If IsObject(objEntityP) = TRUE Then
      txt_sum = txt_sum & "/プロパティ(" & CStr(k) & ")の"
      txt_sum = txt_sum & "名前:" & objEntityP.Attributes("Name").Value
      Select Case objEntityP.Type
      Case "IfcEnumeratedProperty"
'       処理[11]
      Case "IfcLibraryReference"
'       処理[12]
      Case "IfcObjectReference"
'       処理[13]
      Case "IfcPropertyList"
'       処理[14]
      Case "IfcSimpleProperty"
'       処理[15]
      Case "IfcSimplePropertyWithUnit"
'       処理[16]
      End Select
      Set objEntityP = Nothing
    End If
  Next
  MsgBox txt_sum
  Set objAttributesPS = Nothing
End If

さらに、「IfcSimpleProperty」については下記による。

'/// シンプルプロパテイを取得 ///
'[15]に入れる
Set objAttributesP = objEntityP.Attributes
If IsObject(objAttributesP) = TRUE Then
  txt_sum = txt_sum & "/値:"
  Select Case objAttributesP("ValueComponent").Type
  Case "IfcBoolean"
    If objAttributesP("ValueComponent").Value = TRUE Then
      txt_sum = txt_sum & "真"
    Else
      txt_sum = txt_sum & "偽"
    End If
  Case "IfcDescriptiveMeasure"
    txt_sum = txt_sum & objAttributesP("ValueComponent").Value
  Case "IfcString"
    txt_sum = txt_sum & objAttributesP("ValueComponent").Value
  Case "IfcCompoundPlaneAngleMeasure"
    txt_sum = txt_sum & CStr(objAttributesP("ValueComponent").GetItem(1).Value) & ","
    txt_sum = txt_sum & CStr(objAttributesP("ValueComponent").GetItem(2).Value) & ","
    txt_sum = txt_sum & CStr(objAttributesP("ValueComponent").GetItem(3).Value)
  Case Else
    txt_sum = txt_sum & CStr(objAttributesP("ValueComponent").Value)
  End Select
  Set objAttributesP = Nothing
End If

◆拡張プロパティセット/IfcExtensionPropertySet

さらに、プロパティセットに比べてより自由度の高い属性の入れ物として、拡張プロパティセット「IfcExtensionPropertySet」もある。

ENTITY IfcExtensionPropertySet
  SUBTYPE OF (IfcPropertySet);
    DefinitionSource : STRING;
END_ENTITY;

「IfcExtensionPropertySet」は、「IfcPropertySet」の下位クラスであって、その属性を継承し、さらに「DefinitionSource」という属性を持つ。「DefinitionSource」は文字列のデータを持つ。


目次 / /