【BIM二次开发】
很多新手朋友最近咨询我关于一些Revit二次开发基础但是使用频率较高的问题,因此安全人生哲理进行归纳总结,希望能给新手朋友带来一些帮助。这里针对BIM二次开发过程中关于参数的读取、修改、选择过滤器、逻辑过滤器以及单位转换的使用进行总结。
【读取修改Revit元素参数】
这里有两种方式可以读取,对于Parameter参数,可以用get_Parameter(BuiltInParameter.INSTANCE_HEAD_HEIGHT_PARAM)形式来读取、也可以用LookupParameter("顶高度")形式来读取,这两种方式需要配合LookUp工具进行查看使用。在修改参数的时候记得开启任务,用Set()函数进行修改。注意参数值的类型要与参数真实值的类型一致。
ISelectionFilter isf = new xuanzeFilter();//定义选择过滤器
Reference res = uidoc.Selection.PickObject(ObjectType.Element, isf, "请选择门");
Element men = doc.GetElement(res);
//方式1:这种通过内置参数名的形式来进行参数选择
Parameter pm = men.get_Parameter(BuiltInParameter.INSTANCE_HEAD_HEIGHT_PARAM);
//方式2:直接用LookupParameter()函数来进行参数选择
Parameter pm = men.LookupParameter("顶高度");
//参数为:英尺
double l1 = pm.AsDouble();
//参数为:毫米
string l2 = pm.AsValueString();
TaskDialog.Show("长度", l1 + "\r\n" + l2);
using (Transaction ts = new Transaction(doc, "新高度"))
{
ts.Start();//开启任务
//单位转换:将毫米->英尺
double ss = UnitUtils.ConvertToInternalUnits(2500, DisplayUnitType.DUT_MILLIMETERS);
//修改参数
pm.Set(ss);
//提交任务
ts.Commit();
}
【选择过滤器】
选择过滤器在BIM二次开发过程中使用非常频繁的一种过滤器,例如我们规定想选择门,结果用户选择了墙,这样就会容易出现一系列的问题。因此为了限制用户的选择范围,规定用户只选择门,我们就需要用到选择过滤器。顾名思义选择过滤器就是过滤要选择的元素。
//创建过滤器接口对象,并在PickObject()函数中进行引用。
ISelectionFilter isf = new xuanzeFilter();
Reference res = uidoc.Selection.PickObject(ObjectType.Element, isf, "请选择门");
Element men = doc.GetElement(res);
新建选择过滤器接口实现的类:
public class xuanzeFilter : ISelectionFilter
{
public bool AllowElement(Element elem)
{
//根据元素的类别名称是否为门来判断是否为我们要选择的元素,如果是,那么久返回True,否则返回False。
if (elem.Category.Name == "门")
{
return true;
}
return false;
}
public bool AllowReference(Reference reference, XYZ position)
{
return false;
}
}
通过以上设置即可实现只能选择类别为门的元素。
【逻辑过滤器】
这里推荐使用快速过滤器,不建议使用慢速过滤器,否则影响插件性能。
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
//定义收集器
FilteredElementCollector coll = new FilteredElementCollector(doc);
//定义过滤器
ElementCategoryFilter doorCategoryFilter = new ElementCategoryFilter(BuiltInCategory.OST_Doors);
ElementClassFilter fsClassFilter = new ElementClassFilter(typeof(FamilyInstance));
//定义逻辑过滤器
LogicalAndFilter andFilter = new LogicalAndFilter(doorCategoryFilter, fsClassFilter);
//过滤元素
coll.WherePasses(andFilter);
//说明LINQ语句用法
List<ElementId> cs = (from ele in coll
where ele.Id == new ElementId(328856)
select ele.Id).ToList();
//选中指定元素
uidoc.Selection.SetElementIds(cs);
【单位转换】
关于BIM二次开发单位转换是很多新手朋友的难点,其实当你想明白以后就会非常清楚了。在Revit中我们使用的单位是毫米,而在API开发环境中我们使用的单位是英寸,因此我们要将英寸的单位转换成毫米才可以。这里有两种转换方式,一种是通过函数转换,一种是直接通过数字来转换。
using (Transaction ts = new Transaction(doc, "新高度"))
{
ts.Start();
//单位转换:将毫米->英尺
//方式1:用API中单位转换函数转换
double ss = UnitUtils.ConvertToInternalUnits(2500, DisplayUnitType.DUT_MILLIMETERS);
//修改参数
//方式2:等价于pm.Set(2500/304.8)直接数字运算;
pm.Set(ss);
//提交任务
ts.Commit();
}
更多内容欢迎继续关注我的博客,想学习Revit二次开发可以来看一下revit二次开发课程