T.R. wished for the ability to “compare two view templates to identify/highlight differences. Or a way to spit them to txt/xls for compare”
We can get the data from all parameters stored as numbers, text, and element ids. We can also query the properties of the View class. In the sample code, this is done using reflection so code does not need to be written for each property individually.
Also, GetNonControlledTemplateParameterIds returns a list of parameters that are not marked as included when this view is used as a template. GetTemplateParameterIds returns a list of parameter ids that may be controlled when this view is assigned as a template.
Sample output of all parameter values:
------PARAMETERS--------- Category,-2000279 Category,-2000279 Color Scheme Location,1 Design Option,-1 Detail Level,3 Discipline,1 Display Model,0 Edited by, Family, Family, Family and Type, Family and Type, Family Name, Far Clipping,0 Learning Content, Parts Visibility,1 Phase Filter,375 Scale Value 1:,100 Show Hidden Lines,1 Sun Path,0 Type, Type Name, View Scale,100 View Template,-1 Workset,172 ------PROPERTIES--------- AnalysisDisplayStyleId,-1 AreAnalyticalModelCategoriesHidden,False AreAnnotationCategoriesHidden,False AreImportCategoriesHidden,False AreModelCategoriesHidden,False ArePointCloudsHidden,False AssemblyInstanceId,-1 AssociatedAssemblyInstanceId,-1 CanBePrinted,False CreatedPhaseId,-1 DemolishedPhaseId,-1 GroupId,-1 Id,9610 IsAssemblyView,False IsTemplate,True IsValidObject,True LevelId,-1 Name,Architectural Section OwnerViewId,-1 Pinned,False RevealConstraintsMode,False Title,Architectural Section UniqueId,96dd64a0-c5ef-4337-8f9b-658b5c420b33-0000258a ViewName,Architectural Section ViewSpecific,False ViewTemplateId,-1 --------------- Enable Sketchy Lines,False Sketchy Line Extension,0 Sketchy Line Jitter,0
public void exportViewTemplate()
{
Document doc = this.ActiveUIDocument.Document;
string templateName = "Architectural Section";
View template = new FilteredElementCollector(doc).OfClass(typeof(View)).Cast<View>()
.FirstOrDefault(q => q.IsTemplate == true && q.Name == templateName);
using (StreamWriter sw = new StreamWriter(@"C:\Users\harry_000\Desktop\rtc\View Template Export - " + templateName + ".txt"))
{
// quick and easy solution to get data from simple parameters
sw.WriteLine("------PARAMETERS---------");
foreach (Parameter p in template.Parameters.Cast<Parameter>().OrderBy(q => q.Definition.Name))
{
string val = "<undefined>";
if (p.StorageType == StorageType.Double)
val = p.AsDouble().ToString();
else if (p.StorageType == StorageType.Integer)
val = p.AsInteger().ToString();
else if (p.StorageType == StorageType.ElementId)
val = p.AsElementId().IntegerValue.ToString();
else if (p.StorageType == StorageType.String)
val = p.AsString();
if (val != "<undefined>")
sw.WriteLine(p.Definition.Name + "," + val);
}
// use reflection to get values from all properties of the view class
sw.WriteLine("------PROPERTIES---------");
foreach (System.Reflection.PropertyInfo pi in template.GetType().GetProperties().OrderBy(q => q.Name))
{
string propertyName = "";
string propertyValue = "";
getPropertyNameAndValue(template, pi, out propertyName, out propertyValue);
if (propertyValue != "<undefined>")
sw.WriteLine(propertyName + "," + propertyValue);
}
sw.WriteLine("---------------");
// complex parameters require more work to export values individually
ViewDisplaySketchyLines sketchyLines = template.GetSketchyLines();
sw.WriteLine("Enable Sketchy Lines," + sketchyLines.EnableSketchyLines.ToString());
sw.WriteLine("Sketchy Line Extension," + sketchyLines.Extension.ToString());
sw.WriteLine("Sketchy Line Jitter," + sketchyLines.Jitter.ToString());
}
}
private void getPropertyNameAndValue(object o, System.Reflection.PropertyInfo pi, out string propertyName, out string propertyValue)
{
propertyName = pi.Name;
propertyValue = "<undefined>";
if (pi.PropertyType == typeof(ElementId) ||
pi.PropertyType == typeof(Boolean) ||
pi.PropertyType == typeof(String) ||
pi.PropertyType == typeof(Enum))
{
try
{
propertyValue = pi.GetValue(o).ToString();
}
catch
{}
}
}