IFCファイルを作る/(9)部屋情報を作る
2001年6月14日作成、2024年1月1日変更
三木(作成時、IAI設備FM分科会に所属)
(注)利用したIFCのバージョンは2.0。以降のバージョンでは差異がある。
◆部屋(IfcSpace)の情報を作る(1)
(4)で使用したサンプルデータを下記に再掲する。
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;
このサンプルデータを作るプログラムを下記に示す。手順としては、境界(IfcSpaceBoundary)のエンティティを作成した後、部屋(IfcSpace)のエンティティを作成する。[sorry for long]
'/// 変数を定義 ///
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.NewDesign(txt_path & txt_file)
If IsObject(objDesign) = TRUE Then
' 処理[2]
Set objDesign = Nothing
End If
'/// 境界のエンティティを追加し、アトリビュートを設定 ///
'[2]に入れる
ReDim ary_tmp(4)
'1個目
Set objEntity = objDesign.Add("IfcSpaceBoundary")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
objAttributes.Item("PhysicalOrVirtualBoundary").Value = "Physical"
objAttributes.Item("InternalOrExternalBoundary").Value = "External"
objAttributes.Item("calcBoundarySurfaceArea").Value = 20.0
ary_tmp(1) = objEntity.OID
Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
以下同様に、
'2個目
objAttributes.Item("PhysicalOrVirtualBoundary").Value = "Physical"
objAttributes.Item("InternalOrExternalBoundary").Value = "External"
objAttributes.Item("calcBoundarySurfaceArea").Value = 5.0
ary_tmp(2) = objEntity.OID
'3個目
objAttributes.Item("PhysicalOrVirtualBoundary").Value = "Physical"
objAttributes.Item("InternalOrExternalBoundary").Value = "Internal"
objAttributes.Item("calcBoundarySurfaceArea").Value = 20.0
ary_tmp(3) = objEntity.OID
'4個目
objAttributes.Item("PhysicalOrVirtualBoundary").Value = "Physical"
objAttributes.Item("InternalOrExternalBoundary").Value = "Internal"
objAttributes.Item("calcBoundarySurfaceArea").Value = 5.0
ary_tmp(4) = objEntity.OID
とする
'/// 部屋のエンティティを追加し、アトリビュートを設定 ///
'[2]に入れる
Set objEntity = objDesign.Add("IfcSpace")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
For i = 1 To 4
objAttributes.Item("BoundedBy").AddItem objDesign.FindObject(ary_tmp(i))
Next
objAttributes.Item("InteriorOrExteriorSpace").Value = "INTERNAL"
objAttributes.Item("SpaceReference").Value = "R1"
objAttributes.Item("SpaceName").Value = "Office Room"
objAttributes.Item("calcTotalPerimeter").Value = 50.0
objAttributes.Item("calcTotalArea").Value = 100.0
objAttributes.Item("calcTotalVolume").Value = 250.0
objAttributes.Item("calcAverageHeight").Value = 3.3
objAttributes.Item("calcAverageGrossHeight").Value = 3.5
objAttributes.Item("calcAverageClearHeight").Value = 2.5
objAttributes.Item("calcElevationWithFlooring").Value = 0.05
Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
'/// デザインオブジェクトを保存 ///
'[2]に入れる
objDesign.save()
ちなみに、部屋のエンティティの『BoundedBy』属性のように、データが複数であるものについては、『AddItem』メソッドを使う。
◆部屋(IfcSpace)の情報を作る(2)
(5)で使用したサンプルデータを下記に再掲する。
DATA;
#10=IFCSPACE($,$,$,$,(),#11,(),$,(),.INTERNAL.,$,$,0.,0.,0.,0.,0.,0.,0.);
#11=IFCLOCALPLACEMENT($,$,$,#12,#13);
#12=IFCPROJECT($,$,$,$,(),$,$,$,$,$,#14);
#13=IFCAXIS2PLACEMENT3D(#18,#17,#15);
#14=IFCAXIS2PLACEMENT3D(#18,#17,#15);
#15=IFCDIRECTION((1.,0.,0.));
#16=IFCDIRECTION((0.,1.,0.));
#17=IFCDIRECTION((0.,0.,1.));
#18=IFCCARTESIANPOINT((0.,0.,0.));
#19=IFCCARTESIANPOINT((20.,0.,0.));
#20=IFCCARTESIANPOINT((24.,0.,0.));
#21=IFCCARTESIANPOINT((0.,5.,0.));
#22=IFCCARTESIANPOINT((20.,5.,0.));
#23=IFCCARTESIANPOINT((24.,5.,0.));
ENDSEC;
このサンプルデータを作るプログラムを下記に示す。手順としては上記と同様に、点、方向、次元、座標系、位置の各エンティティを順次作成した後、部屋のエンティティを作成する。[sorry for too long]
'/// 点のエンティテイを追加し、アトリビュートを設定 ///
'[2]に入れる
ReDim ary_tmp(6)
'1個目
Set objEntity = objDesign.Add("IfcCartesianPoint")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
objAttributes.Item("Coordinates").AddItem 0.0
objAttributes.Item("Coordinates").AddItem 0.0
objAttributes.Item("Coordinates").AddItem 0.0
ary_tmp(1) = objEntity.OID
Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
以下同様に、
'2個目
objAttributes.Item("Coordinates").AddItem 20.0
objAttributes.Item("Coordinates").AddItem 0.0
objAttributes.Item("Coordinates").AddItem 0.0
ary_tmp(2) = objEntity.OID
'3個目
objAttributes.Item("Coordinates").AddItem 24.0
objAttributes.Item("Coordinates").AddItem 0.0
objAttributes.Item("Coordinates").AddItem 0.0
ary_tmp(3) = objEntity.OID
'4個目
objAttributes.Item("Coordinates").AddItem 0.0
objAttributes.Item("Coordinates").AddItem 5.0
objAttributes.Item("Coordinates").AddItem 0.0
ary_tmp(4) = objEntity.OID
'5個目
objAttributes.Item("Coordinates").AddItem 20.0
objAttributes.Item("Coordinates").AddItem 5.0
objAttributes.Item("Coordinates").AddItem 0.0
ary_tmp(5) = objEntity.OID
'6個目
objAttributes.Item("Coordinates").AddItem 24.0
objAttributes.Item("Coordinates").AddItem 5.0
objAttributes.Item("Coordinates").AddItem 0.0
ary_tmp(6) = objEntity.OID
とする
Dim ary_car
ary_car = ary_tmp
'/// 方向のエンティテイを追加し、アトリビュートを設定 ///
'[2]に入れる
'1個目
ReDim ary_tmp(3)
Set objEntity = objDesign.Add("IfcDirection")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
objAttributes.Item("DirectionRatios").AddItem 1.0
objAttributes.Item("DirectionRatios").AddItem 0.0
objAttributes.Item("DirectionRatios").AddItem 0.0
Set objAttributes = Nothing
End If
ary_tmp(1) = objEntity.OID
Set objEntity = Nothing
End If
以下同様に、
'2個目
objAttributes.Item("DirectionRatios").AddItem 0.0
objAttributes.Item("DirectionRatios").AddItem 1.0
objAttributes.Item("DirectionRatios").AddItem 0.0
ary_tmp(2) = objEntity.OID
'3個目
objAttributes.Item("DirectionRatios").AddItem 0.0
objAttributes.Item("DirectionRatios").AddItem 0.0
objAttributes.Item("DirectionRatios").AddItem 1.0
ary_tmp(3) = objEntity.OID
とする
Dim ary_dir
ary_dir = ary_tmp
'/// 次元のエンティテイを追加し、アトリビュートを設定 ///
'[2]に入れる
ReDim ary_tmp(2)
'1個目
Set objEntity = objDesign.Add("IfcAxis2Placement3D")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
objAttributes.Item("Location").Value = objDesign.FindObject(ary_car(1))
objAttributes.Item("Axis").Value = objDesign.FindObject(ary_dir(3))
objAttributes.Item("RefDirection").Value = objDesign.FindObject(ary_dir(1))
ary_tmp(1) = objEntity.OID
Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
以下同様に、
'2個目
objAttributes.Item("Location").Value = objDesign.FindObject(ary_car(1))
objAttributes.Item("Axis").Value = objDesign.FindObject(ary_dir(3))
objAttributes.Item("RefDirection").Value = objDesign.FindObject(ary_dir(1))
ary_tmp(2) = objEntity.OID
とする
Dim ary_axi
ary_axi = ary_tmp
'/// 座標系のエンティテイを追加し、アトリビュートを設定 ///
ReDim ary_tmp(1)
'[2]に入れる
Set objEntity = objDesign.Add("IfcProject")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
flg_tmp = objAttributes.Item("AbsolutePlacement").SetSelectValue(objDesign.FindObject(ary_axi(2)),"IfcAxis2Placement3D")
Set objAttributes = Nothing
End If
ary_tmp(1) = objEntity.OID
Set objEntity = Nothing
End If
Dim ary_pro
ary_pro = ary_tmp
'/// 位置のエンティテイを追加し、アトリビュートを設定 ///
ReDim ary_tmp(1)
'[2]に入れる
Set objEntity = objDesign.Add("IfcLocalPlacement")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
flg_tmp = objAttributes.Item("PlacementRelTo").SetSelectValue(objDesign.FindObject(ary_pro(1)),"IfcProject")
flg_tmp = objAttributes.Item("RelativePlacement").SetSelectValue(objDesign.FindObject(ary_axi(1)),"IfcAxis2Placement3D")
Set objAttributes = Nothing
End If
ary_tmp(1) = objEntity.OID
Set objEntity = Nothing
End If
Dim ary_loc
ary_loc = ary_tmp
'/// 部屋のエンティティを追加し、アトリビュートを設定 ///
'[2]に入れる
Set objEntity = objDesign.Add("IfcSpace")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
objAttributes.Item("LocalPlacement").Value = objDesign.FindObject(ary_loc(1))
Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
'/// デザインオブジェクトを保存 ///
'[2]に入れる
objDesign.save()
ちなみに、座標系のエンティティの『AbsolutePlacement』属性のように、とりうるデータ型がいくつかある(この場合は、『IfcAxis2Placement2D』と『IfcAxis2Placement3D』)ものについては、『SetSelectValue』メソッドを使う。
◆部屋(IfcSpace)の情報を作る(3)
(7)で使用したサンプルデータを下記に再掲する。
DATA;
#10=IFCRELASSIGNSPROPERTIES($,$,$,.T.,.T.,#13,(#11,#12),$);
#11=IFCSPACE($,$,$,$,(),$,(),$,(),.INTERNAL.,$,'Office Room',0.,0.,0.,0.,
0.,0.,0.);
#12=IFCSPACE($,$,$,$,(),$,(),$,(),.INTERNAL.,$,'Meeting Room',0.,0.,0.,0.,
0.,0.,0.);
#13=IFCPROPERTYSET($,$,$,'Pset_SpaceCommon',(#14,#15,#16,#17));
#14=IFCSIMPLEPROPERTYWITHUNIT('ReqSummerSpaceTemperature',#18);
#15=IFCSIMPLEPROPERTYWITHUNIT('ReqSummerSpaceHumidity',#19);
#16=IFCSIMPLEPROPERTYWITHUNIT('ReqWinterSpaceTemperature',#20);
#17=IFCSIMPLEPROPERTYWITHUNIT('ReqWinterSpaceHumidity',#21);
#18=IFCMEASUREWITHUNIT(IFCPOSITIVELENGTHMEASURE(26.),$);
#19=IFCMEASUREWITHUNIT(IFCPOSITIVELENGTHMEASURE(60.),$);
#20=IFCMEASUREWITHUNIT(IFCPOSITIVELENGTHMEASURE(22.),$);
#21=IFCMEASUREWITHUNIT(IFCPOSITIVELENGTHMEASURE(40.),$);
ENDSEC;
このサンプルデータを作るプログラムを下記に示す。手順としては上記と同様に、値とプロパティのエンティティを順次作成した後、プロパティセットを作成し、続いて部屋のエンティティを作成し、最後に関連付けのエンティティを作成する。[sorry for ...]
'/// 値のエンティティを追加し、アトリビュートを設定 ///
'[2]に入れる
ReDim ary_tmp(4)
'1個目
Set objEntity = objDesign.Add("IfcMeasureWithUnit")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
objAttributes("ValueComponent").Value = 26.0
ary_tmp(1) = objEntity.OID
Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
以下同様に、
'2個目
objAttributes("ValueComponent").Value = 60.0
ary_tmp(2) = objEntity.OID
'3個目
objAttributes("ValueComponent").Value = 22.0
ary_tmp(3) = objEntity.OID
'4個目
objAttributes("ValueComponent").Value = 40.0
ary_tmp(4) = objEntity.OID
とする
Dim ary_mea
ary_mea = ary_tmp
'/// プロパテイのエンティティを追加し、アトリビュートを設定 ///
'[2]に入れる
ReDim ary_tmp(4)
'1個目
Set objEntity = objDesign.Add("IfcSimplePropertyWithUnit")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
objAttributes("Name").Value = "ReqSummerSpaceTemperature"
objAttributes("ValueWithUnit").Value = objDesign.FindObject(ary_mea(1))
ary_tmp(1) = objEntity.OID
Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
以下同様に、
'2個目
objAttributes("Name").Value = "ReqSummerSpaceHumidity"
objAttributes("ValueWithUnit").Value = objDesign.FindObject(ary_mea(2))
ary_tmp(2) = objEntity.OID
'3個目
objAttributes("Name").Value = "ReqWinterSpaceTemperature"
objAttributes("ValueWithUnit").Value = objDesign.FindObject(ary_mea(3))
ary_tmp(3) = objEntity.OID
'4個目
objAttributes("Name").Value = "ReqWinterSpaceHumidity"
objAttributes("ValueWithUnit").Value = objDesign.FindObject(ary_mea(4))
ary_tmp(4) = objEntity.OID
とする
Dim ary_sim
ary_sim = ary_tmp
'/// プロパティセットのエンティティを追加し、アトリビュートを設定 ///
'[2]に入れる
ReDim ary_tmp(1)
Set objEntity = objDesign.Add("IfcPropertySet")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
objAttributes("Name").Value = "Pset_SpaceCommon"
For i = 1 To 4
objAttributes("HasProperties").AddItem objDesign.FindObject(ary_sim(i))
Next
ary_tmp(1) = objEntity.OID
Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
Dim ary_pro
ary_pro = ary_tmp
'/// 部屋のエンティティを追加し、アトリビュートを設定 ///
'[2]に入れる
ReDim ary_tmp(2)
'1個目
Set objEntity = objDesign.Add("IfcSpace")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
objAttributes("SpaceName").Value = "Office Room"
ary_tmp(1) = objEntity.OID
Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
以下同様に、
'2個目
objAttributes("SpaceName").Value = "Meeting Room"
ary_tmp(2) = objEntity.OID
とする
Dim ary_spa
ary_spa = ary_tmp
'/// 関連付けのエンティティを追加し、アトリビュートを設定 ///
Set objEntity = objDesign.Add("IfcRelAssignsProperties")
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then
objAttributes("RelatedIsDependent").Value = TRUE
objAttributes("RelatingIsDependent").Value = TRUE
objAttributes("RelatingPropertyDefinition").Value = objDesign.FindObject(ary_pro(1))
For i = 1 To 2
objAttributes("RelatedObjects").AddItem objDesign.FindObject(ary_spa(i))
Next
Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
'/// デザインオブジェクトを保存 ///
'[2]に入れる
objDesign.save()