private void WriteEntityAttributes(SEntity o)
{
Type t = o.GetType();
if (t.Name.Equals("IfcPixelTexture"))
{
this.ToString();
}
IList<FieldInfo> fields = SEntity.GetFieldsAll(t);
foreach (FieldInfo f in fields)
{
if (f.IsDefined(typeof(DataMemberAttribute)))
{
// write data type properties
Type ft = f.FieldType;
Console.Out.WriteLine("\r\n++ writing attribute: " + ft.Name);
bool isvaluelist = (ft.IsGenericType && ft.GetGenericTypeDefinition() == typeof(List<>) && ft.GetGenericArguments()[0].IsValueType);
bool isvaluelistlist = (ft.IsGenericType && // e.g. IfcTriangulatedFaceSet.Normals
ft.GetGenericTypeDefinition() == typeof(List<>) &&
ft.GetGenericArguments()[0].IsGenericType &&
ft.GetGenericArguments()[0].GetGenericTypeDefinition() == typeof(List<>) &&
ft.GetGenericArguments()[0].GetGenericArguments()[0].IsValueType);
if (isvaluelistlist || isvaluelist || ft.IsValueType)
{
//Console.Out.WriteLine("WriteDataValueAttribute()");
object v = f.GetValue(o);
if (v != null)
{
m_writer.Write(";" + "\r\n");
//m_writer.Write(" ");
WriteIndent();
ObjectProperty p = GetObjectProperty(f.Name + "_" + t.Name);
if (p == null)
Console.Out.WriteLine("Warning: objectproperty not found : " + f.Name + "_" + t.Name);
m_writer.Write("ifcowl:" + p.name + " ");
if (isvaluelistlist)
{
System.Collections.IList list = (System.Collections.IList)v;
WriteListOfListWithValues(ft, list);
}
else if (isvaluelist)
{
System.Collections.IList list = (System.Collections.IList)v;
WriteListWithValues(ft, list);
}
else
{
WriteTypeValue(ft,v);
}
}
else
{
//Console.Out.WriteLine("Empty value: skipping");
}
}
else
{
//Console.Out.WriteLine("WriteObjectPropertyAttribute()");
//Writing object properties
ObjectProperty p = GetObjectProperty(f.Name + "_" + o.GetType().Name);
if (p == null)
Console.Out.WriteLine("Warning: objectproperty not found : " + f.Name + "_" + o.GetType().Name);
//Writing output
object v = f.GetValue(o);
if (v != null)
{
if (v.GetType() == typeof(SEntity))
{
//WriteAttribute(o, f, owlClass);
//m_writer.Write(owlClass + "_" + ((SEntity)value).OID);
Console.Out.WriteLine("WARNING: ATTR object prop exception : " + v.ToString() + " - " + f.Name + " - " + ft.ToString());
}
else
{
if (typeof(System.Collections.ICollection).IsAssignableFrom(ft))
{
System.Collections.IList list = (System.Collections.IList)v;
WriteListKindOfObjectProperty(f, v, ft, p, list);
}
else if (v is SEntity)
{
//found simple object property. give propertyname and URI num
m_writer.Write(";" + "\r\n");
WriteIndent();
m_writer.Write("ifcowl:" + p.name + " ");
Type vt = v.GetType();
this.m_writer.Write("inst:" + vt.Name + "_" + ((SEntity)v).OID);
//There is more in the WriteAttibute method (HTM notation)
}
else if (f.FieldType.IsInterface && v is ValueType)
{
m_writer.Write(";" + "\r\n");
WriteIndent();
m_writer.Write("ifcowl:" + p.name + " ");
Type vt = v.GetType();
Console.Out.WriteLine("WriteEntityAttributes.GetURIObject()");
URIObject newUriObject = GetURIObject(vt.Name, vt.GetField("Value").GetValue(v).ToString(), vt.GetField("Value").FieldType.Name);
m_writer.Write("inst:" + newUriObject.URI);
//this.WriteValueWrapper(v);
}
else if (f.FieldType.IsValueType) // must be IfcBinary
{
Console.Out.WriteLine("MESSAGE-CHECK: Write IfcBinary 1");
m_writer.Write(";" + "\r\n");
WriteIndent();
m_writer.Write("ifcowl:" + p.name + " ");
FieldInfo fieldValue = f.FieldType.GetField("Value");
if (fieldValue != null)
{
v = fieldValue.GetValue(v);
if (v is byte[])
{
// binary data type - we don't support anything other than 8-bit aligned, though IFC doesn't either so no point in supporting extraBits
byte[] bytes = (byte[])v;
char[] s_hexchar = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
StringBuilder sb = new StringBuilder(bytes.Length * 2);
for (int i = 0; i < bytes.Length; i++)
{
byte b = bytes[i];
sb.Append(s_hexchar[b / 0x10]);
sb.Append(s_hexchar[b % 0x10]);
}
v = sb.ToString();
this.m_writer.WriteLine("\""+v+ "\"");
}
}
}
else
{
Console.Out.WriteLine("Warning: Found some other kind of object property: " + p.domain + " - " + p.name);
}
}
}
else
{
Console.Out.WriteLine("Empty value: skipping");
}
}
}
else
{
//Console.Out.WriteLine("Found inverse property - skipping : " + f.Name);
}
}
m_writer.Write(".\r\n\r\n");
Console.Out.WriteLine("End of attribute");
return;
}