使用Revit API提取建筑面积

时间:2018-08-15 15:53:00

标签: c# autodesk revit-api revit

到目前为止,我已经编写了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;
        }

    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

干杯!