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
1250.05
5000.02
20000.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

個々の層の名前

個々の層の厚さ

個々の層の特性の名前

個々の層の特性の値

個々の層の特性の単位

個々の層の特性の単位のべき数


目次 / /