using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using Autodesk.Revit.DB; using KGdev.BI3D.Revit.Common; using KGdev.BI3D.Revit.Common.Models; using Newtonsoft.Json; namespace KGdev.BI3D.Revit.DataExporter.JsonTable { public class JsonTableDataExporter : IDataExporter { public string Name { get { return ".json single elements array"; } } public string Description { get { return "Export data to a .json file representing a single table with all parameters of all exported elements as columns. The .json file will be placed next to the .3dbi file and will be named [FILENAME]_data.json."; } } public string Extension { get { return "json"; } } public List Options { get; } = new List(); public JsonTableDataExporter( ILinkedDocumentsUtilities linkedDocumentsUtilities, IElementIdProvider elementIdProvider ) { this.linkedDocumentsUtilities = linkedDocumentsUtilities; this.elementIdProvider = elementIdProvider; } public void Export( Document rootDocument, List exportedElementIdPaths, string path ) { JsonTableDataExporterResult jsonTableDataExporterResult = new JsonTableDataExporterResult(); path = Path.Combine( Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path) + "_data." + this.Extension ); Dictionary> dictionary = new Dictionary>(); HashSet hashSet = new HashSet { "Id", "CategoryName" }; Dictionary dictionary2 = new Dictionary(); foreach (LinkedElementIdPath linkedElementIdPath in exportedElementIdPaths) { Element element = this.linkedDocumentsUtilities.GetElement( rootDocument, linkedElementIdPath ); string elementId = this.elementIdProvider.GetElementId(linkedElementIdPath); bool flag = element.Category == null; if (!flag) { ElementId typeId = element.GetTypeId(); LinkedElementIdPath linkedElementIdPath2 = new LinkedElementIdPath( linkedElementIdPath.ElementIds ); int count = linkedElementIdPath2.ElementIds.Count; linkedElementIdPath2.ElementIds.RemoveAt(count - 1); linkedElementIdPath2.ElementIds.Add(typeId); ElementType elementType = this.linkedDocumentsUtilities.GetElement(rootDocument, linkedElementIdPath2) as ElementType; string elementId2 = this.elementIdProvider.GetElementId(linkedElementIdPath2); bool flag2 = !dictionary2.ContainsKey(elementId2) && elementType != null; if (flag2) { dictionary2.Add(elementId2, elementType); } this.StoreElementInCollection(element, elementId, dictionary, hashSet); } } Action, Dictionary>> action = null; if (action == null) { action = delegate( IEnumerable keys, Dictionary> objects ) { foreach (string text3 in keys) { foreach (string text4 in objects.Keys) { Dictionary dictionary5 = objects[text4]; bool flag7 = !dictionary5.ContainsKey(text3); if (flag7) { dictionary5.Add(text3, null); } } } }; } List> list = dictionary .Values .ToList>(); bool flag3 = list.Count > 0; if (flag3) { Dictionary dictionary3 = list[0]; foreach (string text in hashSet) { bool flag4 = !dictionary3.ContainsKey(text); if (flag4) { dictionary3.Add(text, null); } } } jsonTableDataExporterResult.Objects.AddRange(list); dictionary.Clear(); hashSet.Clear(); foreach (KeyValuePair keyValuePair in dictionary2) { this.StoreElementInCollection( keyValuePair.Value, keyValuePair.Key, dictionary, hashSet ); } list = dictionary.Values.ToList>(); bool flag5 = list.Count > 0; if (flag5) { Dictionary dictionary4 = list[0]; foreach (string text2 in hashSet) { bool flag6 = !dictionary4.ContainsKey(text2); if (flag6) { dictionary4.Add(text2, null); } } } jsonTableDataExporterResult.Types.AddRange(list); JsonTableDataExporterResult jsonTableDataExporterResult2 = jsonTableDataExporterResult; JsonTableDataExporterDocumentInfo jsonTableDataExporterDocumentInfo = new JsonTableDataExporterDocumentInfo(); jsonTableDataExporterDocumentInfo.Path = rootDocument.PathName; ProjectInfo projectInformation = rootDocument.ProjectInformation; jsonTableDataExporterDocumentInfo.Address = ( (projectInformation != null) ? projectInformation.Address : null ); ProjectInfo projectInformation2 = rootDocument.ProjectInformation; jsonTableDataExporterDocumentInfo.Author = ( (projectInformation2 != null) ? projectInformation2.Author : null ); ProjectInfo projectInformation3 = rootDocument.ProjectInformation; jsonTableDataExporterDocumentInfo.BuildingName = ( (projectInformation3 != null) ? projectInformation3.BuildingName : null ); ProjectInfo projectInformation4 = rootDocument.ProjectInformation; jsonTableDataExporterDocumentInfo.ClientName = ( (projectInformation4 != null) ? projectInformation4.ClientName : null ); ProjectInfo projectInformation5 = rootDocument.ProjectInformation; jsonTableDataExporterDocumentInfo.IssueDate = ( (projectInformation5 != null) ? projectInformation5.IssueDate : null ); ProjectInfo projectInformation6 = rootDocument.ProjectInformation; jsonTableDataExporterDocumentInfo.Name = ( (projectInformation6 != null) ? projectInformation6.Name : null ); ProjectInfo projectInformation7 = rootDocument.ProjectInformation; jsonTableDataExporterDocumentInfo.Number = ( (projectInformation7 != null) ? projectInformation7.Number : null ); ProjectInfo projectInformation8 = rootDocument.ProjectInformation; jsonTableDataExporterDocumentInfo.OrganizationDescription = ( (projectInformation8 != null) ? projectInformation8.OrganizationDescription : null ); ProjectInfo projectInformation9 = rootDocument.ProjectInformation; jsonTableDataExporterDocumentInfo.OrganizationName = ( (projectInformation9 != null) ? projectInformation9.OrganizationName : null ); ProjectInfo projectInformation10 = rootDocument.ProjectInformation; jsonTableDataExporterDocumentInfo.Status = ( (projectInformation10 != null) ? projectInformation10.Status : null ); jsonTableDataExporterResult2.DocumentInfo = jsonTableDataExporterDocumentInfo; using (StreamWriter streamWriter = File.CreateText(path)) { JsonSerializer jsonSerializer = new JsonSerializer(); jsonSerializer.Serialize(streamWriter, jsonTableDataExporterResult); } } private void StoreElementInCollection( Element element, string id, Dictionary> objectDictionaryByObjectId, HashSet encounteredPropertyNames ) { Document document = element.Document; string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(document.PathName); bool flag = !objectDictionaryByObjectId.ContainsKey(id); Dictionary dictionary; if (flag) { dictionary = new Dictionary(); dictionary.Add("DocumentName", fileNameWithoutExtension); dictionary.Add("Id", id); dictionary.Add("ElementId", element.Id.IntegerValue); Dictionary dictionary2 = dictionary; string text = "CategoryName"; Category category = element.Category; dictionary2.Add(text, (category != null) ? category.Name : null); Dictionary dictionary3 = dictionary; string text2 = "TypeId"; ElementId typeId = element.GetTypeId(); dictionary3.Add(text2, (typeId != null) ? typeId.IntegerValue.ToString() : null); objectDictionaryByObjectId.Add(id, dictionary); } else { dictionary = objectDictionaryByObjectId[id]; } foreach (object obj in element.Parameters) { Parameter parameter = (Parameter)obj; object obj2 = null; object obj3 = null; string text3 = null; switch (parameter.StorageType) { case StorageType.Integer: obj2 = parameter.AsInteger(); break; case StorageType.Double: { obj2 = parameter.AsDouble(); UnitType unitType = parameter.Definition.UnitType; bool flag2 = UnitUtils.IsValidUnitType(unitType); if (flag2) { DisplayUnitType displayUnits = document .GetUnits() .GetFormatOptions(unitType) .DisplayUnits; text3 = displayUnits.ToString(); obj3 = UnitUtils.ConvertFromInternalUnits( parameter.AsDouble(), displayUnits ); } break; } case StorageType.String: obj2 = parameter.AsString(); break; case StorageType.ElementId: { ElementId elementId = parameter.AsElementId(); Element element2 = document.GetElement(elementId); obj2 = ((element2 != null) ? element2.Name : ""); break; } } int num = 2; string text4 = "Parameter." + parameter.Definition.Name; while (dictionary.ContainsKey(text4)) { text4 = string.Format( "{0}{1}.{2}", "Parameter.", parameter.Definition.Name, num ); num++; } dictionary.Add(text4, obj2); bool flag3 = !encounteredPropertyNames.Contains(text4); if (flag3) { encounteredPropertyNames.Add(text4); } bool flag4 = obj3 != null; if (flag4) { text4 = text4 + "." + text3; bool flag5 = !encounteredPropertyNames.Contains(text4); if (flag5) { encounteredPropertyNames.Add(text4); } bool flag6 = !dictionary.ContainsKey(text4); if (flag6) { dictionary.Add(text4, obj3); } } } IEnumerable enumerable = from p in element.GetType().GetProperties() where p.GetIndexParameters().Length == 0 select p; foreach (PropertyInfo propertyInfo in enumerable) { string text5 = "Property." + propertyInfo.Name; bool flag7 = dictionary.ContainsKey(text5); if (!flag7) { object obj4 = null; try { obj4 = propertyInfo.GetValue(element); } catch { continue; } bool flag8 = !encounteredPropertyNames.Contains(text5); if (flag8) { encounteredPropertyNames.Add(text5); } bool flag9 = obj4 == null; if (flag9) { dictionary.Add(text5, null); } else { Type type = obj4.GetType(); bool isValueType = type.IsValueType; if (isValueType) { dictionary.Add(text5, obj4); } else { ElementId elementId2 = obj4 as ElementId; bool flag10 = null != elementId2; if (flag10) { dictionary.Add(text5, elementId2.IntegerValue.ToString()); } else { Element element3 = obj4 as Element; bool flag11 = element3 != null; if (flag11) { dictionary.Add(text5, element3.Id.IntegerValue.ToString()); } else { dictionary.Add(text5, obj4.ToString()); } } } } } } } private const string ID_KEY = "Id"; private const string ELEMENT_ID_KEY = "ElementId"; private const string CATEGORY_NAME_KEY = "CategoryName"; private const string TYPE_ID_NAME_KEY = "TypeId"; private const string ELEMENT_DOCUMENT_NAME_KEY = "DocumentName"; private const string PARAMETER_PREFIX = "Parameter."; private const string PARAMETER_BUILTIN_PREFIX = "BuiltIn."; private const string PROPERTY_PREFIX = "Property."; private const string FILE_SUFFIX = "_data"; private readonly ILinkedDocumentsUtilities linkedDocumentsUtilities; private readonly IElementIdProvider elementIdProvider; } }