【问题标题】:Extracting Floor Area using Revit API使用 Revit API 提取建筑面积
【发布时间】:2019-01-22 12:49:02
【问题描述】:

到目前为止,我已经编写了 C# 代码以允许用户在 revit 中选择模型的多个部分,它会发布所选元素的 id。我现在想通过两种方式进行调整:

1,检查所选元素是否为房间。 (有房间标签)所以我只处理房间。

2,发布房间的面积,而不是元素的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;
        }

    }
}

【问题讨论】:

    标签: c# autodesk revit-api revit


    【解决方案1】:

    如果您不熟悉 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 秒内搞定的。 :)

    【讨论】:

    • 非常感谢,我昨天找到了这个问题的答案,但非常感谢您的回复,一定会研究 RevitLookup,再次感谢。
    【解决方案2】:

    如果您只想让人们使用Rooms,那么为什么不将ISelectionFilter 添加到选择工具中,并且只允许他们选择房间开始。然后您不必检查所有对象。以下是有关创建选择过滤器的更多信息。

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

    干杯!

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 2018-09-22
      • 1970-01-01
      • 2019-08-06
      • 2011-10-11
      • 2020-04-20
      • 2013-01-07
      • 1970-01-01
      • 2012-09-11
      相关资源
      最近更新 更多