using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
namespace WorkingDymo
{
/// <summary>
/// 本例子是楼板面积拾取的案例
/// 关于reference与instance之间的转换,以及注意过滤器像墙和地板这种实例的类型过滤不是familyinstance
/// 而是floor或者wall,根据查询确认,而且关于如何通过实例得到面积的参数,直接get_parameter查找就行了
/// </summary>
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
class 楼板面积获取 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uidco = commandData.Application.ActiveUIDocument;
Document doc = uidco.Document;
//选取文档中的楼板
FloorFilter floorFilter = new FloorFilter();
List<Reference> refers = uidco.Selection.PickObjects(ObjectType.Element, floorFilter, "请选择一个地板").ToList();
double area = 0;
foreach (Reference reference in refers)
{
Floor floor = doc.GetElement(reference) as Floor;
area += floor.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
}
//进行简要的单位转换
double areas = area * 0.3048 * 0.3048;
//获得面积
TaskDialog.Show("获得面积", "获得地板总面积是:" + areas);
return Result.Succeeded;
}
}
#region 楼板过滤器
class FloorFilter : ISelectionFilter
{
public bool AllowElement(Element elem)
{
Categories categories = elem.Document.Settings.Categories;
if (elem is Floor && elem.Category.Id == categories.get_Item(BuiltInCategory.OST_Floors).Id)
{
return true;
}
else
{
return false;
}
;//返回true时内容可被鼠标选定
}
public bool AllowReference(Reference reference, XYZ position)
{
return true;//返回true时表示内容可以被边、点、面选中
}
}
#endregion
}
楼板面积统计
最新推荐文章于 2021-07-17 11:58:22 发布