We talked about collecting Project Parameter information before. Now let’s see how SharedParameter Infoer of RevitAddinWizard can assist us to achieve the same goal. The ProjectParameter Infoer can be found from either the Revit Addin Coder sub-menu under the Tools or from Revit Addin Coder toolbar.
When the menu item or button is clicked, the ProjectParameter Infoer window will show up:
If all default settings are accepted and the OK button is clicked, the following ProjectParameter Infoer code will be created and added into the chosen class:
public class RawProjectParameterInfo
{
public static string FileName { get; set; }
public string Name { get; set; }
public BuiltInParameterGroup Group { get; set; }
public ParameterType Type { get; set; }
public bool ReadOnly { get; set; }
public bool BoundToInstance { get; set; }
public string[] BoundCategories { get; set; }
public bool FromShared { get; set; }
public string GUID { get; set; }
public string Owner { get; set; }
public bool Visible { get; set; }
}
public static List<RawProjectParameterInfo> RawGetProjectParametersInfo(Document doc)
{
RawProjectParameterInfo.FileName = doc.Title;
List<RawProjectParameterInfo> paramList = new List<RawProjectParameterInfo>();
BindingMap map = doc.ParameterBindings;
DefinitionBindingMapIterator it = map.ForwardIterator();
it.Reset();
while (it.MoveNext())
{
ElementBinding eleBinding = it.Current as ElementBinding;
InstanceBinding insBinding = eleBinding as InstanceBinding;
Definition def = it.Key;
if (def != null )
{
ExternalDefinition extDef = def as ExternalDefinition;
bool shared = extDef != null;
RawProjectParameterInfo param = new RawProjectParameterInfo
{
Name = def.Name,
Group = def.ParameterGroup,
Type = def.ParameterType,
ReadOnly = def.IsReadOnly,
BoundToInstance = insBinding!=null,
BoundCategories = RawConvertSetToList<Category>(eleBinding.Categories).Select(c=>c.Name).ToArray(),
FromShared = shared,
GUID = shared ? extDef.GUID.ToString() : string.Empty,
Owner = shared ? extDef.OwnerGroup.Name : string.Empty,
Visible = shared ? extDef.Visible : true,
};
paramList.Add(param);
}
}
return paramList;
}
public static List<T> RawConvertSetToList<T>(IEnumerable set)
{
List<T> list = (from T p in set select p).ToList<T>();
return list;
}
public static string RawParametersInfoToCSVString<T>(List<T> infoList, ref string title)
{
StringBuilder sb = new StringBuilder();
PropertyInfo[] propInfoArrary = typeof(T).GetProperties();
foreach (PropertyInfo pi in propInfoArrary)
{
title += pi.Name + ",";
}
title = title.Remove(title.Length - 1);
foreach (T info in infoList)
{
foreach (PropertyInfo pi in propInfoArrary)
{
object obj = info.GetType().InvokeMember(pi.Name, BindingFlags.GetProperty, null, info, null);
IList list = obj as IList;
if (list != null)
{
string str = string.Empty;
foreach (object e in list)
{
str += e.ToString() + ";";
}
str = str.Remove(str.Length - 1);
sb.Append(str + ",");
}
else
{
sb.Append((obj == null ? string.Empty : obj.ToString()) + ",");
}
}
sb.Remove(sb.Length - 1, 1).Append(Environment.NewLine);
}
return sb.ToString();
}
In terms of how to use the class and methods, please refer to previous posts for ideas and code examples.
ProjectParameter Infoer of RevitAddinWizard can create all these in a second.
Recent Comments