IFCファイルを作る/(13)部屋情報の一覧表を作る

2001年8月7日作成、2024年1月1日変更
三木(作成時、IAI設備FM分科会に所属)


(注)利用したIFCのバージョンは2.0。以降のバージョンでは差異がある。

◆実務的な利用

部屋情報の取得については(4)および(7)で扱ったが、ここではより実務的な利用を考えてみる。 建築設備設計の実務においては、最初に、部屋名、面積、高さなどの部屋情報の一覧表が必要になることが多い。 また、通常、この一覧表は階毎に区分されている。 そこで、必要な部屋情報を取得し、これを一覧表にすることを考える。

◆部屋情報

必要な部屋情報として、下記を選ぶ。

◆部屋情報の取得

これらの情報を取得するには、下記による。内容については、これまでのものをまとめただけ(長いだけ)で、特に新しいものはない。

'/// 部屋情報を取得する ///
'[3]に入れる
Dim txt_csv
Dim objEntities_1,objEntity_1,objAttributes_1
Dim objEntities_2,objEntity_2,objAttributes_2
Dim objEntities_3,objEntity_3,objAttributes_3
Dim objEntities_4,objEntity_4,objAttributes_4
Dim objEntities_5,objEntity_5,objAttributes_5

txt_csv = ""
Set objEntities = objDesign.FindObjects("IfcSpace")
If IsObject(objEntities) = TRUE Then
For i = 1 To objEntities.Count
Set objEntity = objEntities.Item(i)
If IsObject(objEntity) = TRUE Then
Set objAttributes = objEntity.Attributes
If IsObject(objAttributes) = TRUE Then

  txt_tmp = ""
' 階名
  Set objEntities_1 = objEntity.GetUsedIn("IfcRelContains","RelatedObjects")
  If IsObject(objEntities_1) = TRUE Then
  For j = 1 To objEntities_1.Count
  Set objEntity_1 = objEntities_1.Item(j)
  If IsObject(objEntity_1) = TRUE Then
  Set objAttributes_1 = objEntity_1.Attributes
  If IsObject(objAttributes_1) = TRUE Then

    If objAttributes_1("RelationshipType").Value = "BuildingStoreyContainer" Then
    Set objEntity_2 = objAttributes_1("RelatingObject").Value
    If IsObject(objEntity_2) = TRUE Then
    Set objAttributes_2 = objEntity_2.Attributes
    If IsObject(objAttributes_2) = TRUE Then

'     txt_tmp = txt_tmp & "/階参照:" & objAttributes_2("BuildingStoreyReference").Value
      txt_tmp = txt_tmp & "/階名:"   & objAttributes_2("BuildingStoreyName").Value
'     txt_tmp = txt_tmp & "/基準高:" & objAttributes_2("Elevation").Value
'     txt_tmp = txt_tmp & "/階高:"   & objAttributes_2("calcTotalHeight").Value
'     txt_tmp = txt_tmp & "/階面積:" & objAttributes_2("calcTotalArea").Value
'     txt_tmp = txt_tmp & "/階容積:" & objAttributes_2("calcTotalVolume").Value

    Set objAttributes_2 = Nothing
    End If
    Set objEntity_2 = Nothing
    End If
    End If

  Set objAttributes_1 = Nothing
  End If
  Set objEntity_1 = Nothing
  End If
  Next
  Set objEntities_1 = Nothing
  End If

' 属性
' txt_tmp = txt_tmp & "/屋内屋外の区別:" & objAttributes("InteriorOrExteriorSpace").Value
' txt_tmp = txt_tmp & "/室参照:" & objAttributes("SpaceReference").Value
  txt_tmp = txt_tmp & "/室名:" & objAttributes("SpaceName").Value
  txt_tmp = txt_tmp & "/周囲長さ:" & objAttributes("calcTotalPerimeter").Value
  txt_tmp = txt_tmp & "/面積:" & objAttributes("calcTotalArea").Value
' txt_tmp = txt_tmp & "/容積:" & objAttributes("calcTotalVolume").Value
' txt_tmp = txt_tmp & "/スラブ下高さ:" & objAttributes("calcAverageHeight").Value
' txt_tmp = txt_tmp & "/階高:" & objAttributes("calcAverageGrossHeight").Value
  txt_tmp = txt_tmp & "/天井高さ:" & objAttributes("calcAverageClearHeight").Value
' txt_tmp = txt_tmp & "/床仕上高さ:" & objAttributes("calcElevationWithFlooring").Value

' プロパティセット
  Set objEntities_1 = objEntity.GetUsedIn("IfcRelAssignsProperties","RelatedObjects")
  If IsObject(objEntities_1) = TRUE Then
  For j = 1 To objEntities_1.Count
  Set objEntity_1 = objEntities_1.Item(j)
  If IsObject(objEntity_1) = TRUE Then
  Set objAttributes_1 = objEntity_1.Attributes
  If IsObject(objAttributes_1) = TRUE Then

    Set objEntity_2 = objAttributes_1("RelatingPropertyDefinition").Value
    If IsObject(objEntity_2) = TRUE Then
    Set objAttributes_2 = objEntity_2.Attributes
    If IsObject(objAttributes_2) = TRUE Then

      If objAttributes_2("Name").Value = "Pset_SpaceCommon" Then
      For k = 1 To objAttributes_2("HasProperties").Size
      Set objEntity_3 = objAttributes_2("HasProperties").Getitem(k)
      If IsObject(objEntity_3) = TRUE Then
      Set objAttributes_3 = objEntity_3.Attributes
      If IsObject(objAttributes_3) = TRUE Then

        Select Case objAttributes_3("Name").Value
        Case "ReqSummerSpaceTemperature"
          txt_tmp = txt_tmp & "/夏季の要求温度:"
        Case "ReqSummerSpaceHumidity"
          txt_tmp = txt_tmp & "/夏季の要求湿度:"
        Case "ReqWinterSpaceTemperature"
          txt_tmp = txt_tmp & "/冬季の要求温度:"
        Case "ReqWinterSpaceHumidity"
          txt_tmp = txt_tmp & "/冬季の要求湿度:"
        End Select

        If objEntity_3.Type = "IfcSimplePropertyWithUnit" then
        Set objEntity_4 = objAttributes_3("ValueWithUnit").Value
        If IsObject(objEntity_4) = TRUE Then
        Set objAttributes_4 = objEntity_4.Attributes
        If IsObject(objAttributes_4) = TRUE Then

          txt_tmp = txt_tmp & objAttributes_4("ValueComponent").Value
'         Set objEntity_5 = objAttributes_4("UnitComponent").Value
'         If IsObject(objEntity_5) = TRUE Then
'         Set objAttributes_5 = objEntity_5.Attributes
'         If IsObject(objAttributes_5) = TRUE Then

'           txt_tmp = txt_tmp & objAttributes_5("Name").Value

'         Set objAttributes_5 = Nothing
'         End If
'         Set objEntity_5 = Nothing
'         End If

        Set objAttributes_4 = Nothing
        End If
        Set objEntity_4 = Nothing
        End If
        End If

      Set objAttributes_3 = Nothing
      End If
      Set objEntity_3 = Nothing
      End If
      Next
      End If

    Set objAttributes_2 = Nothing
    End If
    Set objEntity_2 = Nothing
    End If

  Set objAttributes_1 = Nothing
  End If
  Set objEntity_1 = Nothing
  End If
  Next
  Set objEntities_1 = Nothing
  End If

  MsgBox txt_tmp
  If txt_csv = "" Then
    txt_csv = txt_csv & GetCSVHead(txt_tmp,"/",":") & Chr(13) & Chr(10)
  End If
  txt_csv = txt_csv & GetCSVBody(txt_tmp,"/",":") & Chr(13) & Chr(10)

Set objAttributes = Nothing
End If
Set objEntity = Nothing
End If
Next
Set objEntities = Nothing
End If

'MsgBox txt_csv
InputBox "CSV形式",,txt_csv

'/// データを整形する ///
Function GetCSVHead(txt_old,txt_dlm1,txt_dlm2)
  Dim txt_new,ary_tmp1,ary_tmp2,i,txt_tmp
  ary_tmp1 = Split(txt_old,txt_dlm1)
  txt_new = ""
  For i = LBound(ary_tmp1) To UBound(ary_tmp1)
    txt_tmp = ary_tmp1(i)
    If txt_tmp <> "" Then
      ary_tmp2 = Split(txt_tmp,txt_dlm2)
      txt_tmp = ary_tmp2(LBound(ary_tmp2))
      txt_new = txt_new & "," & txt_tmp
    End If
  Next
  txt_new = Right(txt_new,Len(txt_new) - Len(","))
  GetCSVHead = txt_new
End Function

Function GetCSVBody(txt_old,txt_dlm1,txt_dlm2)
  Dim txt_new,ary_tmp1,ary_tmp2,i
  ary_tmp1 = Split(txt_old,txt_dlm1)
  txt_new = ""
  For i = LBound(ary_tmp1) To UBound(ary_tmp1)
    txt_tmp = ary_tmp1(i)
    If txt_tmp <> "" Then
      ary_tmp2 = Split(txt_tmp,txt_dlm2)
      txt_tmp = ary_tmp2(UBound(ary_tmp2))
      txt_new = txt_new & "," & txt_tmp
    End If
  Next
  txt_new = Right(txt_new,Len(txt_new) - Len(","))
  GetCSVBody = txt_new
End Function

サンプルのイメージ、データ、実行結果を、下記に示す。

サンプルのイメージ

DATA;
#10=IFCRELCONTAINS($,$,$,.F.,.F.,#11,(#24,#25),.BUILDINGSTOREYCONTAINER.,
.CONTAINED.);
#11=IFCBUILDINGSTOREY($,$,$,$,(),$,(),$,'Floor3','3F',7.,3.5,200.,700.);
#12=IFCRELASSIGNSPROPERTIES($,$,$,.T.,.T.,#13,(#24,#25),$);
#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.),#22);
#19=IFCMEASUREWITHUNIT(IFCPOSITIVELENGTHMEASURE(60.),#23);
#20=IFCMEASUREWITHUNIT(IFCPOSITIVELENGTHMEASURE(22.),#22);
#21=IFCMEASUREWITHUNIT(IFCPOSITIVELENGTHMEASURE(40.),#23);
#22=IFCSIUNIT(*,$,$,.DEGREE_CELSIUS.);
#23=IFCSIUNIT(*,$,$,$);
#24=IFCSPACE($,$,$,$,(),$,(),$,(#26,#27,#28,#29),.INTERNAL.,'R1',
'Office Room',50.,100.,250.,3.3,3.5,2.5,0.05);
#25=IFCSPACE($,$,$,$,(),$,(),$,(#30,#31,#32,#33),.INTERNAL.,'R2',
'Meeting Room',18.,20.,50.,3.3,3.5,2.5,0.05);
#26=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.EXTERNAL.,20.);
#27=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.EXTERNAL.,5.);
#28=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.INTERNAL.,20.);
#29=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.INTERNAL.,5.);
#30=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.EXTERNAL.,4.);
#31=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.INTERNAL.,5.);
#32=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.INTERNAL.,4.);
#33=IFCSPACEBOUNDARY($,$,$,$,(),$,(),$,.PHYSICAL.,.EXTERNAL.,5.);
ENDSEC;

OfficeRoomの情報

MeetingRoomの情報

CSV形式の情報

また、実行結果のCSV形式を、Excelなどで読みこむと、計算に利用できる。

容積を計算


目次 / /