IFCファイルを作る/(8)上位クラスの情報を取得する

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


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

◆IfcSpaceの上位クラスの属性

「IfcSpace」が上位クラスから継承する属性について、既に扱った「IfcLocalPlacement」も含めて、ここでまとめてみる。 上位クラスの定義を下記に再掲する。

ENTITY IfcRoot
  ABSTRACT SUPERTYPE OF (ONEOF(
    (略)
   ,IfcObject
    (略)));
    GlobalId     : IfcGloballyUniqueId;
    OwnerHistory : IfcOwnerHistory;
    Label        : OPTIONAL STRING;
  UNIQUE
    (略)
END_ENTITY;

ENTITY IfcObject
  ABSTRACT SUPERTYPE OF (ONEOF(
    (略)
   ,IfcProduct
    (略)))
  SUBTYPE OF (IfcRoot);
    UserDefinedType    : OPTIONAL STRING;
    DocumentReferences : SET [0:?] OF IfcDocumentReference;
  INVERSE
    (略)
END_ENTITY;

ENTITY IfcProduct
  ABSTRACT SUPERTYPE OF (ONEOF(
    (略)
   ,IfcSpatialElement ))
  SUBTYPE OF (IfcObject);
    LocalPlacement  : IfcLocalPlacement;
    Representations : SET [0:2] OF IfcProductRepresentation;
    Classification  : OPTIONAL IfcClassificationList;
END_ENTITY;

ENTITY IfcSpatialElement
  ABSTRACT SUPERTYPE OF (ONEOF(
    IfcSpace
   ,(略)))
  SUBTYPE OF (IfcProduct);
END_ENTITY;

IfcRoot /GlobalId,OwnerHistory,Label
IfcObject /UserDefinedType,DocumentReferences
IfcProduct /LocalPlacement,Representations,Classification
IfcSpatialElement

◆属性の定義

これら上位クラスの属性の定義について、詳細を下記に示す。

(1)GlobalId/グローバルID

TYPE IfcGloballyUniqueId = STRING(20) FIXED;
END_TYPE;

固定長(20文字)の文字列。 定義では「ユニークであること」とされている。 ただし、「ユニークであること」が保証されているわけではないようである。 エンティティを特定したい場合などは、「P21ID」や「OID」を利用する方が良いと思われる。 ユニークな名前付けをおこなうには、下記による。

'/// GlobalIdを付加する ///
Sub AddGUID(objIFCsvr,objEntity)
  Dim objAttributes,txt_tmp
  Set objAttributes = objEntity.Attributes
  If IsObject(objAttributes) = TRUE Then
    txt_tmp = objIFCsvr.GenGUID()             '32文字
    txt_tmp = objIFCsvr.EncodeBase85(txt_tmp) '20文字
    objAttributes.Item("GlobalId").Value = txt_tmp
    Set objAttributes = Nothing
  End If
End Sub

(2)OwnerHistory/所有者履歴

ENTITY IfcOwnerHistory;
    OwningUser        : IfcPersonAndOrganization;
    OwningApplication : IfcApplication;
    ModifiedFlag      : IfcModifiedFlag;
    ApplicationId     : OPTIONAL STRING;
    OwnerDescriptor   : OPTIONAL STRING;
    AuditTrail        : OPTIONAL IfcAuditTrail;
END_ENTITY;

下位の階層をまとめて下記に示す。階層は広く深い。なお[]は複数であることを示す。

IfcOwnerHistory(OwnerHistory)
├IfcPersonAndOrganization(OwningUser)
│├IfcPerson(ThePerson)
││├STRING((FamilyName)
││├STRING(GivenName)
││├STRING(MiddleNames)
││├STRING(PrefixTitles)
││├STRING(SuffixTitles)
││├IfcAdress[](Addresses)
│││├STRING(InternalLocation)
│││├STRING[](AddressLines)
│││├STRING(Town)
│││├STRING(Region)
│││├STRING(PostalCode)
│││├STRING(Country)
│││├STRING[](FacsimileNumbers)
│││├STRING[](TelephoneNumbers)
│││├STRING[](ElectronicMailAddresses)
│││├STRING(TelexNumber)
│││├STRING(WWWHomePageURL)
│││├STRING(Description)
│││└STRING(PostalBox)
││└IfcActorRole[](Roles)
││ ├IfcRoleEnum(Role)
││ │└Enum
││ └STRING(Description)
│├IfcOrganization(TheOrganization)
││├STRING(Name)
││├IfcAddress[](Addresses)/前述
││├IfcActorRole[](Roles)/前述
││└STRING(Description)
│└IfcActorRole[](Roles)/前述
├IfcApplication(OwningApplication)
│├STRING(ApplicationIdentifier)
│├STRING(ApplicationFullName)
│├STRING(Version)
│└IfcOrganization(ApplicationDeveloper)/前述
├IfcModifiedFlag(ModifiedFlag)
│└BINARY
├STRING(ApplicationId)
├STRING(OwnerDescriptor)
└IfcAuditTrail(AuditTrail)
 ├IfcTimeStamp(CreationDate)
 │└INTEGER
 ├IfcTimeStamp(DeletionDate)/前述
 ├IfcPersonAndOrganization(CreatingUser)
 │├IfcPerson(ThePerson)/前述
 │├IfcOrganization(TheOrganization)/前述
 │└IfcActorRole[](Roles)/前述
 ├IfcPersonAndOrganization(DeletingUser)/前述
 ├IfcApplication(CreatingApplication)/前述
 ├IfcApplication(DeletingApplication)/前述
 └IfcTransaction[](Transactions)
  ├IfcTimeStamp(TransactionDate)/前述
  ├IfcPersonAndOrganization(TransactingUser)/前述
  └IfcApplication(TransactingApplication)/前述

(3)Label/ラベル

文字列。任意に使用してよい。

(4)UserDefinedType/ユーザー定義型

文字列。

(5)DocumentReferences/文書参照

ENTITY IfcDocumentReference;
    DocumentType        : IfcDocumentType;
    DocumentName        : STRING;
    DocumentDescription : OPTIONAL STRING;
    Location            : STRING;
    DocumentOwner       : IfcActorSelect;
    PreparedBy          : LIST [0:?] OF IfcActorSelect;
    CreationDate        : IfcDateAndTime;
    Editors             : LIST [0:?] OF IfcActorSelect;
    Revision            : OPTIONAL STRING;
    DateOfRevision      : OPTIONAL IfcDateAndTime;
    DocSectionReference : OPTIONAL STRING;
    DocumentScope       : OPTIONAL STRING;
    DocumentPurpose     : OPTIONAL STRING;
    DocumentIntendedUse : OPTIONAL STRING;
END_ENTITY;

下位の階層をまとめて下記に示す。階層は広く深い。

IfcDocumentReference[](DocumentReferences)
├IfcDocumentType(DocumentType)
│├STRING(FileExtension)
│├STRING(Description)
│└IfcApplication[](EditingApplications)/前述
├STRING(DocumentName)
├STRING(DocumentDescription)
├STRING(Location)
├IfcActorSelect(DocumentOwner)
│├IfcOrganization/前述
│├IfcPerson/前述
│└IfcPersonAndOrganization/前述
├IfcActorSelect[](PreparedBy)/前述
├IfcDateAndTime(CreationDate)
│├IfcCalendarDate(DateComponent)
││├IfcDayInMonthNumber(DayComponent)
│││└INTEGER
││├IfcMonthInYearNumber(MonthComponent)
│││└INTEGER
││└IfcYearNumber(YearComponent)
││ └INTEGER
│└IfcLocalTime(TimeComponent)
│ ├IfcHourInDay(HourComponent)
│ │└INTEGER
│ ├IfcMinuteInHour(MinuteComponent)
│ │└INTEGER
│ ├IfcSecondInMinute(SecondComponent)
│ │└REAL
│ ├IfcCoordinatedUniversalTimeOffset(Zone)
│ │├IfcHourInDay(HourOffset)/前述
│ │├IfcMinuteInHour(MinuteOffset)/前述
│ │└IfcAheadOrBehind(Sense)
│ │ └ENUM
│ └IfcDaylightSavingNumber(DaylightSavingOffset)
│  └INTEGER
├IfcActorSelect[](Editors)/前述
├STRING(Revision)
├IfcDateAndTime(DateOfRevision)/前述
├STRING(DocSectionReference)
├STRING(DocumentScope)
├STRING(DocumentPurpose)
└STRING(DocumentIntendedUse)

(6)LocalPlacement/位置

ENTITY IfcLocalPlacement
  SUBTYPE OF (IfcModelingAid);
    PlacementRelTo    : OPTIONAL IfcObjectWithPlacementSelect;
    RelativePlacement : IfcAxis2Placement;
  WHERE
    (略)
END_ENTITY;

下位の階層をまとめて下記に示す。上位からの継承がある。

IfcLocalPlacement(LocalPlacement)
├IfcGloballyUniqueId(GlobalId)/前述
├IfcOwnerHistory(OwnerHistory)/前述
├STRING(Label)/前述
├IfcObjectWithPlacementSelect(PlacementRelTo)
│├IfcProduct
│├IfcModelingAid
│└IfcProject
└IfcAxis2Placement(RelativePlacement)
 ├IfcAxis2Placement2D
 │├IfcCartesianPoint(Location)
 ││└IfcLengthMeasure[](Coordinates)
 ││ └REAL
 │└IfcDirection(RefDirection)
 │ └REAL[](DirectionRatios)
 └IfcAxis2Placement3D
  ├IfcCartesianPoint(Location)/前述
  ├IfcDirection(Axis)/前述
  └IfcDirection(RefDirection)/前述

(7)Representations/表示

ENTITY IfcProductRepresentation
  ABSTRACT SUPERTYPE OF (ONEOF(
    IfcProductDefinitionShape
   ,IfcProductDefinitionTopology));
    GlobalId     : IfcGloballyUniqueId;
    OwnerHistory : IfcOwnerHistory;
    Name         : OPTIONAL STRING;
    Description  : OPTIONAL STRING;
END_ENTITY;

下位の階層をまとめて下記に示す。

IfcProductRepresentation[](Representations)
├IfcGloballyUniqueId(GlobalId)/前述
├IfcOwnerHistory(OwnerHistory)/前述
├STRING(Name)
└STRING(Description)

(8)Classification/分類

ENTITY IfcClassification;
    Source      : STRING;
    Table       : OPTIONAL STRING;
    Notation    : IfcClassificationNotation;
    Description : STRING;
    Edition     : OPTIONAL STRING;
END_ENTITY;

下位の階層をまとめて下記に示す。

IfcClassification(Classification)
├STRING(Source)
├STRING(Table)
├IfcClassificationNotation(Notation)
│└IfcNotationFacet[](NotationFacets)
│ ├STRING(NotationValue)
│ └STRING(Purpose)
├STRING(Description)
└STRING(Edition)

◆属性の取得

属性を取得する手順を、あらためて下記に示す。

属性を取得する手順

アトリビュート(属性)がエンティティへの参照である場合と、その他である場合は再帰処理とすると、この手順は、下記のように一般化することができる。ここに、エンティティ名と属性名の集まり(数値、文字等に至るまでの各階層における属性名の全て)を与えると、数値、文字等が取得できる。

'/// エンティティの属性値を取得 ///
Function GetEntAtt(txt_entname,txt_attnames)
' txt_attnames : "attname1,attname2,・・・"
  Dim objEntities,objEntity
  Dim txt_attval
  Dim i
  Set objEntities = objDesign.FindObjects(txt_entname)
  For i = 1 To objEntities.Count
    Set objEntity = objEntities.Item(i)
    txt_attval = GetAtt(objEntity,txt_attnames)
  Next
  GetEntAtt = txt_attval
End Function

'/// 属性値を取得 ///
Function GetAtt(objEntity_org,txt_attnames_org)
  Dim objEntity,objAttributes,objAttribute
  Dim txt_attnames,txt_attname
  Dim txt_attval
  Dim txt_tmp,val_tmp,num_tmp,ary_tmp,i

  txt_attval = ""
  ary_tmp = DivStr(txt_attnames_org,",")
  num_tmp = LBound(ary_tmp)
  txt_attname  = ary_tmp(num_tmp)     '"attname1"
  txt_attnames = ary_tmp(num_tmp + 1) '"attname2",attname3,・・・"
  If txt_attname <> "" Then
  Set objEntity = objEntity_org
  If IsObject(objEntity) = TRUE Then
  Set objAttributes = objEntity.Attributes
  If IsObject(objAttributes) = TRUE Then

'   Set objAttribute  = objAttributes.Item(txt_attname) '→NG
'   Set objAttribute  = objAttributes.Item("xxxxxxxxx") '→OK
'   objAttributes.Item()の引数には整数以外の変数を指定できない!
'   ↓置き換え↓
    num_tmp = AttsItemByVar(objAttributes,txt_attname)
    If num_tmp > 0 Then
    Set objAttribute = objAttributes.Item(num_tmp)
'   ↑置き換え↑
    If IsObject(objAttribute) = TRUE Then

      txt_tmp =           "/Name="     &      objAttribute.Name()
      txt_tmp = txt_tmp & "/Type="     &      objAttribute.Type()
      txt_tmp = txt_tmp & "/NodeType=" & CStr(objAttribute.NodeType)
      MsgBox txt_tmp
      txt_attval = AtttoS(objAttribute,txt_attnames)

    Set objAttribute  = Nothing
    End If 'objAttribute
    End If 'num_tmp

  Set objAttributes = Nothing
  End If 'objAttributes
  Set objEntity     = Nothing
  End If 'objEntity
  End If 'txt_attname

  GetAtt = txt_attval
End Function

'/// 属性を文字列に ///
Function AtttoS(objAttribute,txt_attnames)
  Dim txt_attval
  Dim num_nt,num_ant,i
  Select Case DistAtt(objAttribute)
  Case "数値、文字等"
      txt_attval = VtoS(objAttribute.value)
  Case "数値、文字等[複数]"
    For i = 1 To objAttribute.Size
      If i = 1 Then
        txt_attval =                    VtoS(objAttribute.GetItem(i))
      Else
        txt_attval = txt_attval & "," & VtoS(objAttribute.GetItem(i))
      End If
    Next
    txt_attval = "(" & txt_attval & ")"
  Case "エンティティへの参照"
      txt_attval = GetAtt(objAttribute.value,txt_attnames)
  Case "エンティティへの参照[複数]"
    For i = 1 To objAttribute.Size
      If i = 1 Then
        txt_attval =                    GetAtt(objAttribute.GetItem(i),txt_attnames)
      Else
        txt_attval = txt_attval & "," & GetAtt(objAttribute.GetItem(i),txt_attnames)
      End If
    Next
    txt_attval = "(" & txt_attval & ")"
  Case "その他"
    For i = 1 To objAttribute.Size
      If i = 1 Then
        txt_attval =                    AtttoS(objAttribute.GetItem(i),txt_attnames)
      Else
        txt_attval = txt_attval & "," & AtttoS(objAttribute.GetItem(i),txt_attnames)
      End If
    Next
    txt_attval = "(" & txt_attval & ")"
  End Select
  AtttoS = txt_attval
End Function

'/// 属性の種類を判別する ///
Function DistAtt(objAttribute)
  Dim txt_tmp,num_tmp
  num_tmp = objAttribute.NodeType
  If     num_tmp <= 16 Then '1-7,15,16
    txt_tmp = "数値、文字等"
  ElseIf num_tmp  = 18 Then
    txt_tmp = "エンティティへの参照"
  ElseIf num_tmp  = 19 Then
    If VarType(objAttribute.Value) <> 9 Then
      txt_tmp = "数値、文字等"
    Else
      txt_tmp = "エンティティへの参照"
    End if
  ElseIf num_tmp = 20 Then
    num_tmp = objAttribute.AggNodeType
    If     num_tmp <= 16 Then
      txt_tmp = "数値、文字等[複数]"
    ElseIf num_tmp  = 18 Or num_tmp = 19 Then
      txt_tmp = "エンティティへの参照[複数]"
    ElseIf num_tmp = 20 Then
      txt_tmp = "その他"
    End If
  End If
  DistAtt = txt_tmp
End Function

'/// 文字列を分割する ///
Function DivStr(txt_org,txt_dlm)
  Dim num_tmp,txt_for,txt_bak
  num_tmp = InStr(txt_org,txt_dlm)
  If num_tmp > 0 Then
    txt_for =  Left(txt_org,num_tmp - 1)
    txt_bak = Right(txt_org,Len(txt_org) - (num_tmp + Len(txt_dlm) - 1))
  ElseIf txt_org <> "" Then
    txt_for = txt_org
    txt_bak = ""
  Else
    txt_for = ""
    txt_bak = ""
  End If
  DivStr = Array(txt_for,txt_bak)
End Function

'/// Attributes.Item の置き換え ///
Function AttsItemByVar(objAttributes,txt_name)
  Dim imax,imin,i,j
  imax = objAttributes.Count
  imin = 1
  j = 0
  For i = imin To imax
    Set objAttribute = objAttributes.Item(i)
    If IsObject(objAttribute) = TRUE Then
      If objAttribute.Name() = txt_name Then
        j = i
        Exit For
      End If
    End If
  Next
  AttsItemByVar = j
End Function

'/// 値を文字列に ///
Function VtoS(val_tmp)
  Dim txt_tmp
  Select Case VarType(val_tmp)
    Case 0  txt_tmp = ""             'Empty値
    Case 1  txt_tmp = ""             'Null値
    Case 2  txt_tmp =  CStr(val_tmp) '整数型
    Case 3  txt_tmp =  CStr(val_tmp) '長整数型
    Case 4  txt_tmp =  CStr(val_tmp) '単精度実数型
    Case 5  txt_tmp =  CStr(val_tmp) '倍精度実数型
    Case 6  txt_tmp =  CStr(val_tmp) '通貨型
    Case 7  txt_tmp =  CStr(val_tmp) '日付型
    Case 8  txt_tmp =       val_tmp  '文字列型
    Case 9  txt_tmp = ""             'オートメーションオブジェクト
    Case 10 txt_tmp =  CStr(val_tmp) 'エラー値
    Case 11 txt_tmp = TFtoS(val_tmp) 'ブール型
    Case 12 txt_tmp =  CStr(val_tmp) 'バリアント型
    Case 13 txt_tmp = ""             '非オートメーションオブジェクト
    Case 17 txt_tmp =  CStr(val_tmp) 'バイト型
    Case Else txt_tmp = ""
  End Select
  VtoS = txt_tmp
End Function

'/// TRUEorFALSEを文字列に ///
Function TFtoS(flg_tmp)
  Dim txt_tmp
  If flg_tmp = TRUE Then
    txt_tmp = "真"
  Else
    txt_tmp = "偽"
  End If
  TFtoS = txt_tmp
End Function

例として、IfcSpaceのLocalPlacement下の原点座標を取得する場合を、下記に示す。 なお、サンプルデータは(5)のものを使用。

'/// 原点座標を取得する ///
'[8]に入れる
txt_name = "原点座標"
txt_attnames = "LocalPlacement,RelativePlacement,Location,Coordinates"
txt_attval = GetEntAtt(objEntity,txt_attnames)
MsgBox txt_name & ":" & txt_attval

属性情報

属性情報

属性情報

属性情報

属性情報


目次 / /