Since you cannot transfer updates to existing Key Schedules from one project to another, I needed a way to export the data to a standardized key schedule definition so that I could easily import that updated definition information to a new or existing key schedule in an external project. This sample code is what I am using to export all of my key schedules including all of their row data to json file.
Sample data visualization thanks to our friends at http://jsonmate.com/
No I will not make a Dynamo definition for this :)
Enjoy...
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using Autodesk.Revit.Attributes; | |
using Autodesk.Revit.DB; | |
using Autodesk.Revit.UI; | |
using Newtonsoft.Json; | |
namespace Stg.ModelMonitor.Entry | |
{ | |
[Transaction(TransactionMode.Manual)] | |
public class CmdKeySchedules : IExternalCommand | |
{ | |
/// <summary> | |
/// This is the data we'll export | |
/// </summary> | |
public List<KeySchedule> Schedules { get; set; } | |
/// <summary> | |
/// Key Schedules | |
/// </summary> | |
/// <param name="commandData"></param> | |
/// <param name="msg"></param> | |
/// <param name="elements"></param> | |
/// <returns></returns> | |
public Result Execute(ExternalCommandData commandData, ref string msg, ElementSet elements) | |
{ | |
try | |
{ | |
Schedules = new List<KeySchedule>(); | |
Document m_doc = commandData.Application.ActiveUIDocument.Document; | |
// Get the key schedules in the project | |
IEnumerable<ViewSchedule> m_ks = from e in new FilteredElementCollector(m_doc) | |
.OfClass(typeof(ViewSchedule)) | |
let f = e as ViewSchedule | |
where f.Definition.IsKeySchedule | |
select f; | |
foreach (var x in m_ks.ToList()) | |
{ | |
Schedules.Add(new KeySchedule(x)); | |
} | |
// Export to json | |
ExportJson(Schedules, "Key Schedules"); | |
// Done | |
return Result.Succeeded; | |
} catch (Exception ex) | |
{ | |
msg = ex.ToString(); | |
return Result.Failed; | |
} | |
} | |
/// <summary> | |
/// Write an Object to Json | |
/// </summary> | |
/// <param name="sourceData">Top level object to write out to file</param> | |
/// <param name="objName">command kind to use in file name</param> | |
/// <returns>TRUE if file exists after main function</returns> | |
/// <remarks></remarks> | |
private void ExportJson(object sourceData, string objName) | |
{ | |
try | |
{ | |
// Export Path - change this path to suit your neeeds | |
string m_exportPath = @"c:\temp"; | |
if (!Directory.Exists(m_exportPath)) return; | |
string m_fileName = string.Format("{0} {1}.json", | |
DateTime.Now.ToString("yyMMdd hhmmss"), objName); | |
string m_finalPath = Path.Combine(m_exportPath, m_fileName); | |
using (StreamWriter sw = new StreamWriter(m_finalPath, false)) | |
{ | |
sw.WriteLine(JsonConvert.SerializeObject(sourceData)); | |
} | |
} | |
catch { } | |
} | |
} | |
/// <summary> | |
/// Key Schedule Object | |
/// </summary> | |
public class KeySchedule | |
{ | |
public string Category { get; set; } | |
public string Name { get; set; } | |
public string KeyParameterName { get; set; } | |
public List<KeyScheduleRow> Rows { get; set; } | |
/// <summary> | |
/// Key Schedule | |
/// </summary> | |
/// <param name="v"></param> | |
public KeySchedule(ViewSchedule v) | |
{ | |
Rows = new List<KeyScheduleRow>(); | |
Name = v.Name; | |
foreach (Category x in v.Document.Settings.Categories) | |
{ | |
if (x.Id.IntegerValue == v.Definition.CategoryId.IntegerValue) | |
{ | |
Category = x.Name; | |
break; | |
} | |
} | |
KeyParameterName = v.KeyScheduleParameterName; | |
IEnumerable<Element> m_e = from e in new FilteredElementCollector(v.Document, v.Id) select e; | |
foreach (var elem in m_e) | |
{ | |
Rows.Add(new KeyScheduleRow(elem)); | |
} | |
} | |
} | |
/// <summary> | |
/// Key Schedule Row | |
/// Skips readonly parameters | |
/// </summary> | |
public class KeyScheduleRow | |
{ | |
public string KeyName { get; set; } | |
public List<KeyScheduleRowParameter> Parameters { get; set; } | |
public KeyScheduleRow(Element e) | |
{ | |
Parameters = new List<KeyScheduleRowParameter>(); | |
KeyName = e.Name; | |
foreach (Parameter x in e.Parameters) | |
{ | |
if (x.IsReadOnly) continue; | |
var m_name = x.Definition.Name.ToLower(); | |
switch (m_name) | |
{ | |
case "family name": | |
continue; | |
case "type name": | |
continue; | |
case "category": | |
continue; | |
case "design option": | |
continue; | |
} | |
Parameters.Add(new KeyScheduleRowParameter(x)); | |
} | |
} | |
} | |
/// <summary> | |
/// Key Schedule Row Parameter | |
/// </summary> | |
public class KeyScheduleRowParameter | |
{ | |
public string Name { get; set; } | |
public string Value { get; set; } | |
public KeyScheduleRowParameter(Parameter p) | |
{ | |
Name = p.Definition.Name; | |
Value = GetValueString(p); | |
} | |
/// <summary> | |
/// Get a string parameter value as a string | |
/// </summary> | |
/// <param name="p"></param> | |
/// <returns></returns> | |
private string GetValueString(Parameter p) | |
{ | |
try | |
{ | |
if (p != null) | |
{ | |
if (p.StorageType == StorageType.None) | |
return ""; | |
return p.StorageType == StorageType.String | |
? p.AsString() | |
: p.AsValueString(); | |
} | |
} | |
catch { } | |
return "{error}"; | |
} | |
} | |
} |
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.