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;

IfcLocalPlacement


目次 / /