主题:API Sketched Winder Stairs

摘要:该示例演示了通过 sketched stairs API 创建弯曲楼梯的过程。它实现了单点 L-Winder U-Winder 布局算法。它还利用了 DMU(动态模型更新)框架来重新生成弯曲楼梯。

相关类:

Autodesk.Revit.DB.XYZ

Autodesk.Revit.DB.Arc

Autodesk.Revit.DB.Line

Autodesk.Revit.DB.Curve

Autodesk.Revit.DB.Transform

Autodesk.Revit.DB.Transaction

Autodesk.Revit.DB.StairsEditScope

Autodesk.Revit.DB.Architecture.Stairs

Autodesk.Revit.DB.Architecture.StairsRun

Autodesk.Revit.DB.IUpdater

Autodesk.Revit.DB.UpdaterRegistry

Autodesk.Revit.UI.IExternalEventHandler

Autodesk.Revit.UI.ExternalEvent

Autodesk.Revit.UI.IExternalCommand

项目文件:

Command.cs

它包含从 IExternalCommand 接口继承并实现 Execute 方法的 Command 类。

 

WinderUpdater.cs

该类实现了 IUpdater IExternalEventHandler 接口。它主要用于弯曲楼梯的创建和在其依赖项发生更改时进行重生成。

 

WinderCorner.cs

它代表弯曲区域,用于连接直线段。对于 L 形楼梯,有一个 WinderCorner;对于 U 形楼梯,有两个这样的组件。

 

WinderSinglePoint.cs

此类继承自 WinderCorner。它表示单点弯曲拐角。它实现了澳大利亚单点算法。

 

WinderStraight.cs

它表示连接到弯曲拐角的直线段。

 

Winder.cs

它表示弯曲楼梯,并可能包括多个直线段和弯曲角。

 

LWinder.cs

它继承自 Winder,并表示 L 形弯曲楼梯。L-Winder 由两个直线段和一个弯曲角组成。

 

UWinder.cs

它继承自 Winder,并表示 U 形弯曲楼梯。U-Winder 由三个直线段和两个弯曲角组成。

 

WinderUtil.cs

它验证 Revit 文档中的曲线等输入参数。它还调整输入数据以创建弯曲楼梯。

 

LWinderOptions.cs

该表单用于收集 LWinder 创建的参数。它还验证输入参数。

 

UWinderOptions.cs

该表单用于收集 UWinder 创建的参数。它还验证输入参数。

描述:

该示例提供以下功能。

- 允许用户创建单点 L 形弯曲楼梯,如下所示:

 

参数说明:

N:弯曲区域中的步数

A:起点处平行步数

B:终点处平行步数

C:楼梯跑道宽度

E:从中心点到内侧边界的距离(默认为 0,在澳大利亚)

F:从中心点到内侧边界的距离(默认为 0,在澳大利亚)

 

 

- 允许用户创建单点 U 形弯曲楼梯,如下所示:

 

参数说明:

C:楼梯跑道宽度

N1:第一个弯曲区域中的步数

N2:第二个弯曲区域中的步数

A1:起点处平行步数

A2:终点处平行步数

B:中间部分的平行步数

E1:从中心点到内侧边界的距离(默认为 0,在澳大利亚)

F1:从中心点到内侧边界的距离(默认为 0,在澳大利亚)

E2:从中心点到内侧边界的距离(默认为 0,在澳大利亚)

F2:从中心点到内侧边界的距离(默认为 0,在澳大利亚)

说明:

启动 Revit 并打开 WinderStairs.rvt 文件。

1. 创建 L 形弯曲楼梯。

a. 选择两个连接的直墙或模型线。

b. 执行命令,将显示一个窗体。

c. 调整窗体上的参数以创建 L 形弯曲楼梯。

d. 有两个复选框 "DMU" "Sketch"DMU 用于控制选择的墙或模型线更改时是否重新生成 L 形楼梯。Sketch 选项表示是否将弯曲草图(包括边界、走道和踏步)绘制为模型曲线。

e. 单击“确定”按钮以创建 L 形弯曲楼梯。

f. 预期结果:L 形弯曲楼梯将被创建。

 

2. 创建 U 形弯曲楼梯。

a. 选择三个连接的直墙或模型线。

b. 执行命令,将显示一个窗体。

c. 调整窗体上的参数以创建 U 形弯曲楼梯。

d. 有两个复选框 "DMU" "Sketch"DMU 用于控制选择的墙或模型线更改时是否重新生成 U 形楼梯。Sketch 选项表示是否将弯曲草图(包括边界、走道和踏步)绘制为模型曲线。

e. 单击“确定”按钮以创建 U 形弯曲楼梯。

f. 预期结果:U 形弯曲楼梯将被创建。

完整的源代码请加入QQ群649037449,在群文件中下载RevitSDK.exe,解压后在文件夹中搜索本文中应用程序名称即可获得完整源码

WinderUpdater.cs

//
// (C) Copyright 2003-2019 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//

using System;
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB.Architecture;

namespace Revit.SDK.Samples.WinderStairs.CS
{
    /// <summary>
    /// This class implements IUpdater and IExternalEventHandler interfaces. It's mainly
    /// for winder stairs creation and regeneration when its dependencies are being changed.
    /// </summary>
    class WinderUpdater : IUpdater, IExternalEventHandler
    {
        private UpdaterId m_updaterId = null;
        private IList<ElementId> m_curveElements = null;
        private ElementId m_winderRunId = ElementId.InvalidElementId;
        private Winder m_winder = null;
        private bool m_removeTheUpdater = false;
        private bool m_drawSketch = false;

        /// <summary>
        /// Constructor to initialize the fields and create the winder stairs.
        /// It also registers the updater if addinId is not null.
        /// </summary>
        /// <param name="winder">Winder to create winder stairs</param>
        /// <param name="crvElements">Curve Elements to control the winder shape</param>
        /// <param name="rvtDoc">Revit Document</param>
        /// <param name="addinId">Active AddInId</param>
        /// <param name="drawSketch">Switch to control the winder sketch drawing</param>
        public WinderUpdater(Winder winder, IList<ElementId> crvElements,
            Document rvtDoc, AddInId addinId, bool drawSketch)
        {
            m_curveElements = crvElements;
            m_winder = winder;
            m_drawSketch = drawSketch;

            // Create the winder stairs
            GenerateWinderStairs(rvtDoc);

            // Register the updater if addinId is not null.
            if (addinId != null)
            {
                // Register the updater
                m_updaterId = new UpdaterId(addinId, Guid.NewGuid());
                UpdaterRegistry.RegisterUpdater(this, rvtDoc);

                // Add modification triggers
                UpdaterRegistry.AddTrigger(m_updaterId, rvtDoc, 
                    m_curveElements, Element.GetChangeTypeAny());
                
                // Add deletion trigger
                List<ElementId> deleteParents = new List<ElementId>();
                deleteParents.AddRange(crvElements);
                var stairRun = rvtDoc.GetElement(m_winderRunId) as StairsRun;
                deleteParents.Add(stairRun.GetStairs().Id);
                UpdaterRegistry.AddTrigger(m_updaterId, rvtDoc,
                    deleteParents, Element.GetChangeTypeElementDeletion());
            }
        }

        /// <summary>
        /// Create the winder stairs in the Document.
        /// </summary>
        /// <param name="rvtDoc">Revit Document.</param>
        private void GenerateWinderStairs(Document rvtDoc)
        {
            if (m_removeTheUpdater)
            {
                // unregister this updater
                UpdaterRegistry.UnregisterUpdater(m_updaterId, rvtDoc);
                return;
            }

            // Create the winder
            m_winder.ControlPoints = WinderUtil.CalculateControlPoints(rvtDoc, m_curveElements);
            m_winder.Build(rvtDoc, m_drawSketch, ref m_winderRunId);
        }

        /// <summary>
        /// Implementation of IUpdater.Execute method.
        /// </summary>
        void IUpdater.Execute(UpdaterData data)
        {
            // If there is any deleted elements, this updater need to be unregistered.
            if (data.GetDeletedElementIds().Count != 0)
            {
                // set the unregistered flag, 
                // because it's not allowed to remove the executing updater.
                m_removeTheUpdater = true;
            }
            // Raise the External Event
            ExternalEvent exEvent = ExternalEvent.Create(this);
            exEvent.Raise();
        }

        /// <summary>
        /// Implementation of IUpdater.GetAdditionalInformation method.
        /// </summary>
        string IUpdater.GetAdditionalInformation()
        {
            return "API SKETCHED WINDER";
        }

        /// <summary>
        /// Implementation of IUpdater.GetChangePriority method.
        /// </summary>
        ChangePriority IUpdater.GetChangePriority()
        {
            return ChangePriority.GridsLevelsReferencePlanes;
        }

        /// <summary>
        /// Implementation of IUpdater.GetUpdaterId method.
        /// </summary>
        UpdaterId IUpdater.GetUpdaterId()
        {
            return m_updaterId;
        }

        /// <summary>
        /// Implementation of IUpdater.GetUpdaterName method.
        /// </summary>
        string IUpdater.GetUpdaterName()
        {
            return "Revit.SDK.Samples.WinderStairs";
        }

        /// <summary>
        /// Implementation of IExternalEventHandler.Execute method.
        /// </summary>
        void IExternalEventHandler.Execute(UIApplication app)
        {
            try
            {
                GenerateWinderStairs(app.ActiveUIDocument.Document);
            }
            catch (System.Exception ex)
            {
                TaskDialog.Show("WinderStairs", 
                    "Can't generate the winder layout because " + ex.Message);
            }
        }

        /// <summary>
        /// Implementation of IExternalEventHandler.GetName method.
        /// </summary>
        string IExternalEventHandler.GetName()
        {
            return "Revit.SDK.Samples.WinderStairs";
        }
    }
}