IFCファイルを作る/(5)位置の情報を取得する
2001年4月23日作成、2024年1月1日変更
三木(作成時、IAI設備FM分科会に所属)
(注)利用したIFCのバージョンは2.0。以降のバージョンでは差異がある。
◆位置/LocalPlacement
位置は属性の中でも特に重要なものである。位置は「LocalPlacement」で表わされる。2個の物体の間の相対的な位置をいう。
実際に「IfcLocalPlacement」を作成すると下記のようになる。5個の属性を持つ。
'/// 位置のエンティティを追加 ///
'[2]または[3]に入れる
Dim objEntity
Set objEntity = objDesign.Add("IfcLocalPlacement")
If IsObject(objEntity) = TRUE Then
Set objEntity = Nothing
End If
objDesign.save()
DATA;
#10=IFCLOCALPLACEMENT($,$,$,$,$);
ENDSEC;
◆IfcLocalPlacementの定義
「IfcLocalPlacement」は「IfcModelingAid」の下位クラスであって、「PlacementRelTo」と「RelativePlacement」の2個の属性を持ち、それぞれは「IfcObjectWithPlacementSelect」、「IfcAxis2Placement」のデータを持つ。
ENTITY IfcLocalPlacement
SUBTYPE OF (IfcModelingAid);
PlacementRelTo : OPTIONAL IfcObjectWithPlacementSelect;
RelativePlacement : IfcAxis2Placement;
WHERE
(略)
END_ENTITY;
「IfcModelingAid」は「IfcRoot」の下位クラスであって、それ自体は属性を持たない。
ENTITY IfcModelingAid
ABSTRACT SUPERTYPE OF (ONEOF(
IfcLocalPlacement
,IfcDesignGrid
,IfcGridAxis
,IfcGridIntersection
,IfcGridLevel
,IfcLightSource
,IfcPhotometricOutputSpace
,IfcPlacementConstraint
,IfcReferenceGeometryAid ))
SUBTYPE OF (IfcRoot);
END_ENTITY;
一方「IfcRoot」は3個の属性を持つ。これが継承されて「IfcLocalPlacement」の属性が5個になっている。
ENTITY IfcRoot
ABSTRACT SUPERTYPE OF (ONEOF(
IfcModelingAid
,IfcObject
,IfcPropertyDefinition
,IfcRelationship));
GlobalId : IfcGloballyUniqueId;
OwnerHistory : IfcOwnerHistory;
Label : OPTIONAL STRING;
UNIQUE
UR1: GlobalId;
END_ENTITY;
IfcRoot /GlobalId,OwnerHistory,Label
└IfcModelingAid
└IfcLocalPlacement /PlacementRelTo,RelativePlacement
◆属性の定義
「IfcObjectWithPlacementSelect」は「IfcProduct」「IfcModelingAid」「IfcProject」のいずれかである。座標系がこれらのいずれに基づくかを示す。「IfcProject」ならグローバル、その他はローカルになる。デフォルトは「IfcProject」である。
TYPE IfcObjectWithPlacementSelect = SELECT (
IfcProduct
,IfcModelingAid
,IfcProject);
END_TYPE;
ENTITY IfcProject
SUBTYPE OF (IfcObject);
ReferenceName : OPTIONAL STRING;
Name : OPTIONAL STRING;
Phase : OPTIONAL STRING;
UnitsInContext : IfcUnitAssignment;
Classification : OPTIONAL IfcClassificationList;
AbsolutePlacement : IfcAxis2Placement;
END_ENTITY;
一方「IfcAxis2Placement」は「IfcAxis2Placement2D」「IfcAxis2Placement3D」のいずれかである。前者は2次元の場合、後者は3次元の場合である。
TYPE IfcAxis2Placement = SELECT (
IfcAxis2Placement2D
,IfcAxis2Placement3D);
END_TYPE;
「IfcAxis2Placement2D」は「IfcPlacement」の下位クラスであって、「RefDirection」の属性を持つ。「IfcPlacement」からは「Location」の属性を継承する。ここに「Location」は原点を、「RefDirection」はX軸方向をそれぞれ表わし、これにより「IfcAxis2Placement2D」は2次元(Y軸は誘導する)の座標系を表わす。
また「IfcAxis2Placement3D」は「IfcAxis2Placement2D」に「Axis(Z軸方向)」の属性が加わったもので、3次元の座標系を表わす。
ENTITY IfcAxis2Placement2D
SUBTYPE OF (IfcPlacement);
RefDirection : OPTIONAL IfcDirection;
DERIVE
(略)
WHERE
(略)
END_ENTITY;
ENTITY IfcAxis2Placement3D
SUBTYPE OF (IfcPlacement);
Axis : OPTIONAL IfcDirection;
RefDirection : OPTIONAL IfcDirection;
DERIVE
(略)
WHERE
(略)
END_ENTITY;
ENTITY IfcPlacement
ABSTRACT SUPERTYPE OF (ONEOF(
IfcAxis1Placement
,IfcAxis2Placement2D
,IfcAxis2Placement3D))
SUBTYPE OF (IfcGeometricRepresentationItem);
Location : IfcCartesianPoint;
DERIVE
(略)
END_ENTITY;
ENTITY IfcGeometricRepresentationItem
ABSTRACT SUPERTYPE OF (ONEOF(
IfcBooleanResult
,IfcBoundingBox
,IfcCompositeCurveSegment
,IfcCurve
,IfcDirection
,IfcHalfSpaceSolid
,IfcPlacement
,IfcPoint
,IfcPolyLoop
,IfcSolidModel
,IfcSurface
,IfcVector));
END_ENTITY;
「IfcDirection」は「IfcGeometricRepresentationItem」の下位クラスであって、「DirectionRatios」の属性を持つ。「DirectionRatios」は2個(2次元)または3個(3次元)の実数のリストである。
ENTITY IfcDirection
SUBTYPE OF (IfcGeometricRepresentationItem);
DirectionRatios : LIST [2:3] OF REAL;
DERIVE
(略)
WHERE
(略)
END_ENTITY;
また「IfcCartesianPoint」は「IfcPoint」の下位クラスであって、「Coordinates」の属性を持つ。「Coordinates」は「IfcLengthMeasure」のデータの1〜3個の集まりである。
ENTITY IfcCartesianPoint
SUBTYPE OF (IfcPoint);
Coordinates : LIST [1:3] OF IfcLengthMeasure;
DERIVE
(略)
WHERE
(略)
END_ENTITY;
ENTITY IfcPoint
ABSTRACT SUPERTYPE OF (ONEOF(
IfcCartesianPoint))
SUBTYPE OF (IfcGeometricRepresentationItem);
END_ENTITY;
◆IfcLocalPlacementの取得
以上により、「IfcLocalPlacement」を取得するには、下記による(エラー処理は省略)。
'/// IfcSpaceのLocalPlacementのアトリビュートを取得する ///
'[9]に入れる
Dim objAttribute
Dim txt_sum
txt_sum = ""
Set objAttribute = objAttributes.Item("LocalPlacement")
Dim objEntity_new,objAttribute_new
Dim objEntity_newer,objAttribute_newer
Dim objEntity_newest,objAttribute_newest
Set objEntity_new = objAttribute.Value
Dim txt_sum
txt_sum = ""
'↓ここから
Set objAttribute_new = objEntity_new.Attributes.Item("PlacementRelTo")
Set objEntity_newer = objAttribute_new.Value
Select Case objEntity_newer.Type
Case "IfcProduct"
txt_sum = txt_sum & "/座標系の区別:IfcProduct(ローカル)"
Case "IfcModelingAid"
txt_sum = txt_sum & "/座標系の区別:IfcModelingAid(ローカル)"
Case "IfcProject"
txt_sum = txt_sum & "/座標系の区別:IfcProject(グローバル)"
Case Else
txt_sum = txt_sum & "/座標系の区別:IfcProject(グローバル)"
End Select
'↑ここまで
'↓ここから
Set objAttribute_new = objEntity_new.Attributes.Item("RelativePlacement")
Set objEntity_newer = objAttribute_new.Value
Select Case objEntity_newer.Type
Case "IfcAxis2Placement2D"
txt_sum = txt_sum & "/2次元3次元の区別:2次元"
Set objAttribute_newer = objEntity_newer.Attributes.Item("Location")
Set objEntity_newest = objAttribute_newer.Value
Set objAttribute_newest = objEntity_newest.Attributes.Item("Coordinates")
txt_sum = txt_sum & "/原点:"
txt_sum = txt_sum & "(" & objAttribute_newest.GetItem(1)
txt_sum = txt_sum & "," & objAttribute_newest.GetItem(2) & ")"
Set objAttribute_newer = objEntity_newer.Attributes.Item("RefDirection")
Set objEntity_newest = objAttribute_newer.Value
Set objAttribute_newest = objEntity_newest.Attributes.Item("DirectionRatios")
txt_sum = txt_sum & "/X軸方向:"
txt_sum = txt_sum & "(" & objAttribute_newest.GetItem(1)
txt_sum = txt_sum & "," & objAttribute_newest.GetItem(2) & ")"
Case "IfcAxis2Placement3D"
txt_sum = txt_sum & "/2次元3次元の区別:3次元"
Set objAttribute_newer = objEntity_newer.Attributes.Item("Location")
Set objEntity_newest = objAttribute_newer.Value
Set objAttribute_newest = objEntity_newest.Attributes.Item("Coordinates")
txt_sum = txt_sum & "/原点:"
txt_sum = txt_sum & "(" & objAttribute_newest.GetItem(1)
txt_sum = txt_sum & "," & objAttribute_newest.GetItem(2)
txt_sum = txt_sum & "," & objAttribute_newest.GetItem(3) & ")"
Set objAttribute_newer = objEntity_newer.Attributes.Item("Axis")
Set objEntity_newest = objAttribute_newer.Value
Set objAttribute_newest = objEntity_newest.Attributes.Item("DirectionRatios")
txt_sum = txt_sum & "/Z軸方向:"
txt_sum = txt_sum & "(" & objAttribute_newest.GetItem(1)
txt_sum = txt_sum & "," & objAttribute_newest.GetItem(2)
txt_sum = txt_sum & "," & objAttribute_newest.GetItem(3) & ")"
Set objAttribute_newer = objEntity_newer.Attributes.Item("RefDirection")
Set objEntity_newest = objAttribute_newer.Value
Set objAttribute_newest = objEntity_newest.Attributes.Item("DirectionRatios")
txt_sum = txt_sum & "/X軸方向:"
txt_sum = txt_sum & "(" & objAttribute_newest.GetItem(1)
txt_sum = txt_sum & "," & objAttribute_newest.GetItem(2)
txt_sum = txt_sum & "," & objAttribute_newest.GetItem(3) & ")"
End Select
'↑ここまで
Set objEntity_new = Nothing
Set objAttribute_new = Nothing
Set objEntity_newer = Nothing
Set objAttribute_newer = Nothing
Set objEntity_newest = Nothing
Set objAttribute_newest = Nothing
MsgBox txt_sum
サンプルデータと実行結果を下記に示す。
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;