Xbim中定义的P21ParseAction是一个枚举类型,如下:
public enum P21ParseAction
{
BeginList, //0
EndList, //1
BeginComplex, //2
EndComplex, //3
SetIntegerValue, //4
SetHexValue, //5
SetFloatValue, //6
SetStringValue, //7
SetEnumValue, //8
SetBooleanValue, //9
SetNonDefinedValue, //0x0A
SetOverrideValue, //x0B
BeginNestedType, //0x0C
EndNestedType, //0x0D
EndEntity, //0x0E
NewEntity, //0x0F
SetObjectValueUInt16,
SetObjectValueInt32,
SetObjectValueInt64
}
Xbim解析模块类型匹配如下:
public static void ReadPropertyValueType(byte[] entityData/*BinaryReader br*/)
{
string str;
BinaryReader br = new BinaryReader(new MemoryStream(entityData));
var action = (P21ParseAction)br.ReadByte();
while (action != P21ParseAction.EndEntity)
{
switch (action)
{
case P21ParseAction.BeginList:
break;
case P21ParseAction.EndList:
break;
case P21ParseAction.BeginComplex:
break;
case P21ParseAction.EndComplex:
break;
case P21ParseAction.SetIntegerValue:
str = br.ReadInt64().ToString();
break;
case P21ParseAction.SetHexValue:
str = br.ReadInt64().ToString();
break;
case P21ParseAction.SetFloatValue:
str = br.ReadDouble().ToString();
break;
case P21ParseAction.SetStringValue:
str = br.ReadString();
break;
case P21ParseAction.SetEnumValue:
str = br.ReadString();
break;
case P21ParseAction.SetBooleanValue:
str = br.ReadBoolean().ToString();
break;
case P21ParseAction.SetNonDefinedValue:
break;
case P21ParseAction.SetOverrideValue:
break;
case P21ParseAction.SetObjectValueUInt16:
str = br.ReadUInt16().ToString();
break;
case P21ParseAction.SetObjectValueInt32:
str = br.ReadInt32().ToString();
break;
case P21ParseAction.SetObjectValueInt64:
str = br.ReadInt64().ToString();
break;
case P21ParseAction.BeginNestedType:
str = br.ReadString();
break;
case P21ParseAction.EndNestedType:
break;
case P21ParseAction.EndEntity:
break;
case P21ParseAction.NewEntity:
break;
default:
throw new XbimException("Invalid Property Record #");
}
action = (P21ParseAction)br.ReadByte();
}
}
测试解析结果的函数
var _context = tran.Model.Context;
string query =
$"select {EntityTableInfo.EntityData} from " +
$"{EntityTableInfo.TableName} " +
$"where {EntityTableInfo.EntityID} = {214}";
var entityData = _context.Database.SqlQuery<byte[]>(query).First();
if (entityData != null)
{
ReadPropertyValueType(entityData);
}
entityID为214的的定义如下:
#214= IFCPROPERTYSINGLEVALUE('Actual Lighting Load',$,IFCPOWERMEASURE(0.),$);
其中entityDate的数据为:('Actual Lighting Load',$,IFCPOWERMEASURE(0.),$);
entityDate的解析如下表:
( | P21ParseAction.BeginList |
'Actual Lighting Load' | P21ParseAction.SetStringValue |
$ | P21ParseAction.SetNonDefinedValue |
IFCPOWERMEASURE | P21ParseAction.BeginNestedType |
( | P21ParseAction.BeginList |
0 | P21ParseAction.SetFloatValue |
) | P21ParseAction.EndList |
P21ParseAction.EndNestedType | |
$ | P21ParseAction.SetNonDefinedValue |
) | P21ParseAction.EndList |
P21ParseAction.EndEntity |