部屋情報の取得については(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;