使用 Revit 提取建筑面积 API

Extracting Floor Area using Revit API

到目前为止,我已经编写了 C# 代码以允许用户在 revit 中 select 模型的多个部分,并且它将 post selected 元素的 ID。我现在想以两种方式对此进行调整:

1、判断元素selected是否为房间。 (有房间标签)所以我只处理房间。

2,post 所述房间的面积,而不仅仅是元素的 ID。

我对 C# 和 Revit 还很陌生 API 所以会感谢任何正确方向的推动,谢谢。

我当前的代码:

using System;
using System.Collections.Generic;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System.Linq;
using System.Text;

namespace HelloWorld
{

    [Transaction(TransactionMode.Manual)]
    public class Class1 : IExternalCommand
    {
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Application app = uiapp.Application;
            Document doc = uidoc.Document;

            IList<Reference> pickedObjs = uidoc.Selection.PickObjects(ObjectType.Element, "Select elements");
            List<ElementId> ids = (from Reference r in pickedObjs select r.ElementId).ToList();

            using (Transaction tx = new Transaction(doc))
            {
                StringBuilder sb = new StringBuilder();
                tx.Start("transaction");
                if (pickedObjs != null && pickedObjs.Count > 0)
                {
                    foreach (ElementId eid in ids)
                    {
                        Element e = doc.GetElement(eid);
                        sb.Append("/n" +e.Name);
                    }
                    TaskDialog.Show("Area Calculator", sb.ToString());
                }
                tx.Commit();
            }
            return Result.Succeeded;
        }

    }
}

如果您是 Revit 新手 API,那么我建议您从 GitHub 获取最新版本的 RevitLookup,将其部署到您的 Revit 上并开始使用它。它将帮助您确定可以使用哪些 Revit API 对象来让您的工具正常工作。

根据您当前的问题。查明给定元素是否为房间:

Room room = e as Room;
if (room!=null) ... ; //then you know it's a Room

或者:

if (e is Room) ... ; //then you know it's a Room

第二部分:查询你写的元素的参数:

Parameter par = e.get_Parameter(BuiltInParameter.ROOM_AREA);
string valSting = par.AsValueString();
double valDouble = par.AsDouble(); //mind the value is in native Revit units, not project units. So square feet in this case

您也可以使用 par = e.LookupParameter("Area");,但如果您使用系统参数,最好使用内置枚举来引用它们(例如,因为它们是语言证明)

通常我会为 MEP 开发工具和宏,所有这些都是我使用 RevitLookup 插件在 10 秒内搞定的。 :)

如果您只想让人们使用 Rooms 那么为什么不在 selection 工具中添加 ISelectionFilter,并且只允许他们 select 房间开始。这样您就不必检查所有对象。下面是有关创建 select 离子过滤器的更多信息。

https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/Revit-API/files/GUID-ECB1EE82-EA91-451C-995C-7683C1F676CB-htm.html

干杯!