IfcDoc.FormatTTL_Stream.WriteEntityAttributes C# (CSharp) Method

WriteEntityAttributes() private method

private WriteEntityAttributes ( SEntity o ) : void
o IfcDoc.Schema.SEntity
return void
        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;
        }