前言
这个例子介绍了 Revit 多层楼梯的功能。
内容
这个例子默认不在 sample 项目中,需要自己手动加入。并且由于没有在项目的列表中,没有被 Autodesk 官方团队维护,导致并不能正常运行。需要进行一些修改。
这个例子用的接口,可以参考:Revit API: 多层楼梯 MultistoryStairs
运行效果
效果如下,必须在立面中才能正常运行。这个功能没有与时俱进,Revit 新版本中三维视图和剖面视图也有楼层可以选择,可以考虑放开一下这个限制。
这个例子里有三个命令,分别用于:
- 创建多层楼梯,
CreateMultistoryStairsCommand
- 往多层楼梯中添加楼层,
AddStairsCommand
- 从多层楼梯中删除楼层,
RemoveStairsCommand
关键代码
CreateMultistoryStairsCommand
// 选中一个楼梯,创建多层楼梯
newTran = new Transaction(doc, "Create Multistory Stairs");
newTran.Start();
MultistoryStairs.Create(stairsElem);
newTran.Commit();
AddStairsCommand
newTran = new Transaction(doc, "Add Stairs to Multistory Stairs");
newTran.Start();
mStairs.ConnectLevels(new HashSet<ElementId>(userSelectedIds));
newTran.Commit();
RemoveStairsCommand
newTran = new Transaction(doc, "Remove Stairs from Multistory Stairs");
newTran.Start();
mStairs.DisconnectLevels(new HashSet<ElementId>(userSelectedIds));
newTran.Commit();
LevelSelectionFilter
在往多层楼梯中增删楼梯的过程中,需要对选中做一些过滤,避免选中楼梯以外的 Element。这个部分也是现在这个例子中有bug的地方之一,需要做如下修改。
// class LevelSelectionFilter : ISelectionFilter
public bool AllowElement(Autodesk.Revit.DB.Element elem)
{
if (!(elem is Level))
return false;
if (null == m_MS)
return false;
if (OperationAction.Add == m_action)
return m_MS.CanConnectLevel(elem.Id);
if (OperationAction.Remove == m_action)
return m_MS.CanDisconnectLevel(elem.Id);
if(OperationAction.Unpin == m_action)
return m_MS.GetStairsOnLevel(elem.Id) != null;
if (OperationAction.PinBack == m_action)
return m_MS.GetStairsOnLevel(elem.Id) == null;
return false;
}