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」は文字列のデータを持つ。