前言
这个例子介绍如何设置族参数的排序,只能是升序或者降序。
内容
结果
运行这个例子,打开文件时会弹出如下对话框。可以选择升序或者降序,程序会运行一段时间,对族的参数进行排序。
以家具中的桌子为例,分别选择升序和降序的结果,注意排序是在每个分组内部排的,例如 “尺寸标注”:
核心的逻辑
查看代码:Revit 2021 SDK\Samples\FamilyParametersOrder\CS\SortLoadedFamiliesParamsForm.cs
步骤:
- 把
Family
过滤出来 - 获取
Family
的Document
- 对参数进行排序
- 保存
Family
到临时目录 - 以覆盖的方式重新载入
Family
- 删除临时目录下的
Family
核心代码:
private void SortParameters(ParametersOrder order)
{
// 把 `Family` 过滤出来
FilteredElementCollector coll = new FilteredElementCollector(m_currentDoc);
IList<Element> families = coll.OfClass(typeof(Family)).ToElements();
foreach (Family fam in families)
{
if (!fam.IsEditable)
continue;
// 获取 `Family` 的 `Document`
Document famDoc = m_currentDoc.EditFamily(fam);
// 对参数进行排序
using (Transaction trans = new Transaction(famDoc, "Sort parameters."))
{
trans.Start();
famDoc.FamilyManager.SortParameters(order);
trans.Commit();
}
// 保存 `Family` 到临时目录
string tmpFile = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), fam.Name + ".rfa");
if (File.Exists(tmpFile))
File.Delete(tmpFile);
famDoc.SaveAs(tmpFile);
famDoc.Close(false);
// 以覆盖的方式重新载入 `Family`
using (Transaction trans = new Transaction(m_currentDoc, "Load family."))
{
trans.Start();
IFamilyLoadOptions famLoadOptions = new FamilyLoadOptions();
Family newFam = null;
m_currentDoc.LoadFamily(tmpFile, new FamilyLoadOptions(), out newFam);
trans.Commit();
}
// 删除临时目录下的 `Family`
File.Delete(tmpFile);
}
}
其它
SortFamilyFilesParamsForm
用了类似的逻辑,就不再赘述了。