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()


目次 / /