IFCファイルを作る/(11)材料を表わす
2001年6月28日作成、2024年1月1日変更
三木(作成時、IAI設備FM分科会に所属)
(注)利用したIFCのバージョンは2.0。以降のバージョンでは差異がある。
◆材料/IfcMaterial他
一つの材料を表わす場合は「IfcMaterial」を使用する。また、複数の材料を表わす場合は、層として扱うべきものは「IfcMaterialLayer」および「IfcMaterialLayerSet」を、そうでないものは「IfcMaterialList」を使用する。
TYPE IfcMaterialSelect = SELECT (
IfcMaterial
,IfcMaterialList
,IfcMaterialLayer
,IfcMaterialLayerSet);
END_TYPE;
ENTITY IfcMaterial;
MaterialName : STRING;
MaterialClassification : OPTIONAL IfcClassificationList;
MaterialFinishes : SET [0:?] OF IfcMaterialFinish;
Properties : SET [0:?] OF IfcMaterialPropertySelect;
END_ENTITY;
DATA;
#10=IFCMATERIAL($,$,(),());
ENDSEC;
ENTITY IfcMaterialList;
Materials : LIST [1:?] OF IfcMaterial;
END_ENTITY;
DATA;
#10=IFCMATERIALLIST(());
ENDSEC;
ENTITY IfcMaterialLayer;
Material : IfcMaterial;
OffsetFromMLSBase : IfcLengthMeasure;
LayerThickness : IfcPositiveLengthMeasure;
INVERSE
(略)
END_ENTITY;
DATA;
#10=IFCMATERIALLAYER($,0.,0.);
ENDSEC;
ENTITY IfcMaterialLayerSet;
HasMaterialLayers : LIST [1:?] OF IfcMaterialLayer;
IsVentilated : BOOLEAN;
END_ENTITY;
DATA;
#10=IFCMATERIALLAYERSET((),.F.);
ENDSEC;
◆材料/IfcMaterialの属性
「IfcMaterial」は、「MaterialName」(名称)、「Properties」(特性)、「MaterialFinishes」(仕上げ)、「MaterialClassification」(分類)の属性を持つ。
このうち「Properties」は「IfcSimpleProperty」「IfcSimplePropertyWithUnit」または「IfcTable」型の、また「MaterialFinishes」は「IfcMaterialFinish」型(「Properties」とほぼ同じ)のデータを持つ。
TYPE IfcMaterialPropertySelect = SELECT (
IfcSimpleProperty
,IfcSimplePropertyWithUnit
,IfcTable);
END_TYPE;
ENTITY IfcMaterialFinish;
FinishName : STRING;
Properties : LIST [0:?] OF IfcMaterialPropertySelect;
INVERSE
(略)
END_ENTITY;
DATA;
#10=IFCMATERIALFINISH($,());
ENDSEC;
なお、「IfcTable」型は表形式のデータを表わすことができる。
ENTITY IfcTable;
GlobalId : IfcGloballyUniqueId;
Name : STRING;
Rows : LIST [1:?] OF IfcTableRow;
END_ENTITY;
ENTITY IfcTableRow;
RowCells : LIST [1:?] OF IfcMeasureValue;
IsHeading : BOOLEAN;
INVERSE
(略)
END_ENTITY;
例えば、周波数別の吸収率を表わしたものを、下記に示す。
ただし、この形式では、「RowCells」が「IfcMeasureValue」型のデータしか持てないので、そのままでは単位を表わすことができない。
DATA;
#10=IFCTABLE($,'Frequency/Coefficient',(#11,#12,#13,#14));
#11=IFCTABLEROW((IFCSTRING('Frequency(Hz)'),IFCSTRING('Coefficient')),.T.);
#12=IFCTABLEROW((IFCINTEGER(125),IFCREAL(0.05)),.F.);
#13=IFCTABLEROW((IFCINTEGER(500),IFCREAL(0.02),.F.);
#14=IFCTABLEROW((IFCINTEGER(2000),IFCREAL(0.05),.F.);
ENDSEC;
| Frequency(Hz) | Coefficient |
| 125 | 0.05 |
| 500 | 0.02 |
| 2000 | 0.05 |
◆材料の層/IfcMaterialLayerおよびIfcMaterialLayerSet
「IfcMaterialLayer」は「Material」(材料:IfcMaterial)「LayerThickness」(厚さ)「OffsetFromMLSBase」(オフセット寸法)の属性を持ち、材料の層を表わす。
また、「IfcMaterialLayerSet」は「HasMaterialLayers 」(材料の層:IfcMaterialLayer)「IsVentilated」(中空層が換気/非換気)の属性を持ち、複数の材料の層の組み合わせを表わす。
さらに、「IfcMaterialLayerSetUsage」は「ForLayerSet」(材料の層の組み合わせ:IfcMaterialLayerSet)「MlsOffsetFromBaseline」(オフセット寸法)「MlsSenseLtoR」(層の方向)の属性を持ち、材料の層の組み合わせの使い方を表わす。
ENTITY IfcMaterialLayerSetUsage;
ForLayerSet : IfcMaterialLayerSet;
MlsOffsetFromBaseline : IfcLengthMeasure;
MlsSenseLtoR : BOOLEAN;
DERIVE
(略)
END_ENTITY;
DATA;
#10=IFCMATERIALLAYERSETUSAGE($,0.,.F.);
ENDSEC;
例えば、タイル、モルタル、コンクリートから成る4層の壁について、寸法および熱伝導率を表わしたものを、下記に示す。
DATA;
#10=IFCMATERIALLAYERSET((#11,#12,#13,#14),.F.); /* 層全体 */
#11=IFCMATERIALLAYER(#15,0.,0.01); /* 個々の層 */
#12=IFCMATERIALLAYER(#16,0.,0.02);
#13=IFCMATERIALLAYER(#17,0.,0.15);
#14=IFCMATERIALLAYER(#16,0.,0.02);
#15=IFCMATERIAL('Tile',$,(),(#18)); /* 個々の材質 */
#16=IFCMATERIAL('Mortar',$,(),(#19));
#17=IFCMATERIAL('Concrete',$,(),(#20));
#18=IFCSIMPLEPROPERTYWITHUNIT('ThermalConductivity',#21); /* 個々の熱伝導率 */
#19=IFCSIMPLEPROPERTYWITHUNIT('ThermalConductivity',#22);
#20=IFCSIMPLEPROPERTYWITHUNIT('ThermalConductivity',#23);
#21=IFCMEASUREWITHUNIT(IFCPOSITIVELENGTHMEASURE(1.28),#24);/* 個々の熱伝導率の値 */
#22=IFCMEASUREWITHUNIT(IFCPOSITIVELENGTHMEASURE(1.08),#24);
#23=IFCMEASUREWITHUNIT(IFCPOSITIVELENGTHMEASURE(1.64),#24);
#24=IFCDERIVEDUNIT((#25,#26,#27),.USERDEFINED.); /* 熱伝導率の単位[W/mK] */
#25=IFCDERIVEDUNITELEMENT(#28,1); /* 個々の構成単位のべき数 */
#26=IFCDERIVEDUNITELEMENT(#29,-1);
#27=IFCDERIVEDUNITELEMENT(#30,-1);
#28=IFCSIUNIT(*,.UNSPECIFIED.,$,.WATT.); /* 個々の構成単位 */
#29=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#30=IFCSIUNIT(*,.THERMODYNAMICTEMPERATUREUNIT.,$,.KELVIN.);
ENDSEC;
◆材料のデータを取得する
上記の壁の個々の層の寸法と熱伝導率を取得する。
まず、IfcMaterial他の構造を下記に示す。([]は集まりを示す。)
IfcMaterialSelect(HasMaterial)
├IfcMaterial
│├STRING(MaterialName)
│├IfcClassificationList(MaterialClassification)/→(8)参照
│├IfcMaterialPropertySelect[](Properties)
││├IfcSimpleProperty
│││├STRING(Name)
│││└IfcMeasureValue(ValueComponent)
││├IfcSimplePropertyWithUnit
│││├STRING(Name)
│││└IfcMeasureWithUnit(ValueWithUnit)
│││ ├IfcMeasureValue(ValueComponent)/前述
│││ └IfcUnit(UnitComponent)/→(10)参照
││└IfcTable
││ ├IfcGloballyUniqueId(GlobalId)
││ ├STRING(Name)
││ ├IfcTableRow[](Rows)
││ │├IfcMeasureValue[](RowCells)/前述
││ │└BOOLEAN(IsHeading)
││ ├INTEGER(NumberOfCellsInRow)
││ ├INTEGER(NumberOfHeadings)
││ └INTEGER(NumberOfDataRows)
│└IfcMaterialFinish[](MaterialFinishes)
│ ├STRING(FinishName)
│ └IfcMaterialPropertySelect[](Properties)/前述
├IfcMaterialList
│└IfcMaterial[](Materials)/前述
├IfcMaterialLayer
│├IfcMaterial(Material)/前述
│├IfcLengthMeasure(OffsetFromMLSBase)
││└REAL
│└IfcPositiveLengthMeasure(LayerThickness)
│ └IfcLengthMeasure/前述
└IfcMaterialLayerSet
├IfcMaterialLayer[](HasMaterialLayers)/前述
└BOOLEAN(IsVentilated)
'/// 変数を定義 ///
Dim objIFCsvr,objDesign,objEntities,objEntity,objAttributes,objAttribute
Dim txt_path,txt_file
Dim txt_tmp,val_tmp,num_tmp,flg_tmp,ary_tmp,i
' 処理[0]
'/// IFCサーバーオブジェクトを生成 ///
'[0]に入れる
Set objIFCsvr = CreateObject("IFCsvr.R200")
If IsObject(objIFCsvr) = TRUE Then
' 処理[1]
Set objIFCsvr = Nothing
End If
'/// 既存ファイルを開きデザインオブジェクトを生成 ///
'[1]に入れる
txt_path = "C:\Program Files\IFCsvrR200\sample\" '適当なパス名
txt_file = "new.ifc" '適当なファイル名
Set objDesign = objIFCsvr.OpenDesign(txt_path & txt_file)
If IsObject(objDesign) = TRUE Then
' 処理[3]
Set objDesign = Nothing
End If
'/// エンティティを取得 ///
'[3]に入れる
Set objEntities = objDesign.FindObjects("IfcMaterialLayerSet")
If IsObject(objEntities) = TRUE Then
For i = 1 To objEntities.Count
Set objEntity = objEntities.Item(i)
If IsObject(objEntity) = TRUE Then
' 処理[8]
Set objEntity = Nothing
End If
Next
Set objEntities = Nothing
End If
'/// 経路を与えて属性を取得する ///
'[8]に入れる
txt_name = "個々の層の名前"
txt_path = "HasMaterialLayers,Material,MaterialName"
txt_tmp = GetAtt(objEntity,txt_path)
MsgBox txt_name & ":" & txt_tmp
txt_name = "個々の層の厚さ"
txt_path = "HasMaterialLayers,LayerThickness"
txt_tmp = GetAtt(objEntity,txt_path)
MsgBox txt_name & ":" & txt_tmp
txt_name = "個々の層の特性の名前"
txt_path = "HasMaterialLayers,Material,Properties,Name"
txt_tmp = GetAtt(objEntity,txt_path)
MsgBox txt_name & ":" & txt_tmp
txt_name = "個々の層の特性の値"
txt_path = "HasMaterialLayers,Material,Properties,ValueWithUnit,ValueComponent"
txt_tmp = GetAtt(objEntity,txt_path)
MsgBox txt_name & ":" & txt_tmp
txt_val2 = txt_tmp
txt_name = "個々の層の特性の単位"
txt_path = "HasMaterialLayers,Material,Properties,ValueWithUnit,UnitComponent,Elements,Unit,Name"
txt_tmp = GetAtt(objEntity,txt_path)
MsgBox txt_name & ":" & txt_tmp
txt_name = "個々の層の特性の単位のべき数"
txt_path = "HasMaterialLayers,Material,Properties,ValueWithUnit,UnitComponent,Elements,Exponent"
txt_tmp = GetAtt(objEntity,txt_path)
MsgBox txt_name & ":" & txt_tmp