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