使用 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 秒内搞定的。 :)
如果您只想让人们使用 Room
s 那么为什么不在 selection 工具中添加 ISelectionFilter
,并且只允许他们 select 房间开始。这样您就不必检查所有对象。下面是有关创建 select 离子过滤器的更多信息。
干杯!
到目前为止,我已经编写了 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 秒内搞定的。 :)
如果您只想让人们使用 Room
s 那么为什么不在 selection 工具中添加 ISelectionFilter
,并且只允许他们 select 房间开始。这样您就不必检查所有对象。下面是有关创建 select 离子过滤器的更多信息。
干杯!