Revit 二次开发 获取属性,并修改属性值,配合Revit Lookup一起联用开发项目

获取数据方式一(用户选择)

获取风管的面积

C#代码实现

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShowInfo
{
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    public class DevTVHelloWorld : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            //封装一些与用户交互的东西
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            //1、选择一根风管
            Selection sel=uidoc.Selection;
            //2、选择的对象,对象的类型是枚举类型:ObjectType;返回一个对象的引用
            Reference r=sel.PickObject(ObjectType.PointOnElement);
            //3、获取具体的模型
            Element element=doc.GetElement(r);
            Duct duct = element as Duct;
            if (duct == null) return Result.Failed;
            //获取属性
            Parameter parameter=duct.get_Parameter(BuiltInParameter.RBS_CURVE_SURFACE_AREA);
            //获取面积
            double area = parameter.AsDouble();
            TaskDialog.Show("demo01", area.ToString());
            return Result.Succeeded;
        }
    }
}

演示

注:其他的API方法,都可以使用Revit Lookup方法使用找相应方法

修改偏移量的值

将刚才的C#代码修改如下

修改了获取duct.get_Parameter()的枚举值,然后开启一个事务,修改值,提交事务

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShowInfo
{
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    public class DevTVHelloWorld : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            //封装一些与用户交互的东西
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            //1、选择一根风管
            Selection sel=uidoc.Selection;
            //2、选择的对象,对象的类型是枚举类型:ObjectType;返回一个对象的引用
            Reference r=sel.PickObject(ObjectType.PointOnElement);
            //3、获取具体的模型
            Element element=doc.GetElement(r);
            Duct duct = element as Duct;
            if (duct == null) return Result.Failed;
            //获取属性,偏移量
            Parameter parameter=duct.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM);
            using (Transaction trans =new Transaction(doc,"偏移量")) //所有对模型的操作,都要开启事务
            {
                trans.Start();//开启事务
                parameter.SetValueString("2000");//重新设置偏移量
                trans.Commit(); //提交事务
            }
            return Result.Succeeded;
        }
    }
}

测试

获取数据方式二(元素过滤容器)

类型过滤(ofClass)

将原先的C#代码修改为如下

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShowInfo
{
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    public class DevTVHelloWorld : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            //方式一
            ////封装一些与用户交互的东西
            //UIDocument uidoc = commandData.Application.ActiveUIDocument;
            //Document doc = uidoc.Document;
            ////1、选择一根风管
            //Selection sel=uidoc.Selection;
            ////2、选择的对象,对象的类型是枚举类型:ObjectType;返回一个对象的引用
            //Reference r=sel.PickObject(ObjectType.PointOnElement);
            ////3、获取具体的模型
            //Element element=doc.GetElement(r);
            //Duct duct = element as Duct;
            //if (duct == null) return Result.Failed;
            ////获取属性,偏移量
            //Parameter parameter=duct.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM);
            //using (Transaction trans =new Transaction(doc,"偏移量")) //所有对模型的操作,都要开启事务
            //{
            //    trans.Start();//开启事务
            //    parameter.SetValueString("2000");//重新设置偏移量
            //    trans.Commit(); //提交事务
            //}
            //return Result.Succeeded;

            //=============================
            //方式二
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            //创建一个用于存放Element的容器,,获取当前Document所有元素的集合
            FilteredElementCollector col = new FilteredElementCollector(doc);
            //对元素进行过滤,元素过滤的类型是风管(Duct)
            col.OfClass(typeof(Duct));
            foreach (Duct duct in col)
            {
                Parameter parameter = duct.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM);
                TaskDialog.Show("偏移量", parameter.AsValueString());
            }
            return Result.Succeeded;
        }
    }
}

测试

种类过滤(OfCategory)

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShowInfo
{
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    public class DevTVHelloWorld : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            //方式一
            ////封装一些与用户交互的东西
            //UIDocument uidoc = commandData.Application.ActiveUIDocument;
            //Document doc = uidoc.Document;
            ////1、选择一根风管
            //Selection sel=uidoc.Selection;
            ////2、选择的对象,对象的类型是枚举类型:ObjectType;返回一个对象的引用
            //Reference r=sel.PickObject(ObjectType.PointOnElement);
            ////3、获取具体的模型
            //Element element=doc.GetElement(r);
            //Duct duct = element as Duct;
            //if (duct == null) return Result.Failed;
            ////获取属性,偏移量
            //Parameter parameter=duct.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM);
            //using (Transaction trans =new Transaction(doc,"偏移量")) //所有对模型的操作,都要开启事务
            //{
            //    trans.Start();//开启事务
            //    parameter.SetValueString("2000");//重新设置偏移量
            //    trans.Commit(); //提交事务
            //}
            //return Result.Succeeded;

            //=============================
            //方式二
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            //创建一个用于存放Element的容器,,获取当前Document所有元素的集合
            FilteredElementCollector col = new FilteredElementCollector(doc);
            //对元素进行过滤,元素过滤的类型是风管(Duct)
            //col.OfClass(typeof(Duct));
            //对种类进行过滤,参数为枚举类型
            col.OfCategory(BuiltInCategory.OST_DuctCurves);foreach (Duct duct in col)
            {
                Parameter parameter = duct.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM);
                TaskDialog.Show("偏移量", parameter.AsValueString());
            }
            return Result.Succeeded;
        }
    }
}

自定义过滤器(WherePasses)

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShowInfo
{
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    public class DevTVHelloWorld : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            //方式一
            ////封装一些与用户交互的东西
            //UIDocument uidoc = commandData.Application.ActiveUIDocument;
            //Document doc = uidoc.Document;
            ////1、选择一根风管
            //Selection sel=uidoc.Selection;
            ////2、选择的对象,对象的类型是枚举类型:ObjectType;返回一个对象的引用
            //Reference r=sel.PickObject(ObjectType.PointOnElement);
            ////3、获取具体的模型
            //Element element=doc.GetElement(r);
            //Duct duct = element as Duct;
            //if (duct == null) return Result.Failed;
            ////获取属性,偏移量
            //Parameter parameter=duct.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM);
            //using (Transaction trans =new Transaction(doc,"偏移量")) //所有对模型的操作,都要开启事务
            //{
            //    trans.Start();//开启事务
            //    parameter.SetValueString("2000");//重新设置偏移量
            //    trans.Commit(); //提交事务
            //}
            //return Result.Succeeded;

            //=============================
            //方式二
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            //创建一个用于存放Element的容器,,获取当前Document所有元素的集合
            FilteredElementCollector col = new FilteredElementCollector(doc);
            //对元素进行过滤,元素过滤的类型是风管(Duct)
            //col.OfClass(typeof(Duct));
            //对种类进行过滤,参数为枚举类型
            //col.OfCategory(BuiltInCategory.OST_DuctCurves);
            //自定义过滤器
            col.WherePasses(new ElementClassFilter(typeof(Duct))); //等价于col.OfClass(typeof(Duct));
            foreach (Duct duct in col)
            {
                Parameter parameter = duct.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM);
                TaskDialog.Show("偏移量", parameter.AsValueString());
            }
            return Result.Succeeded;
        }
    }
}
原文地址:https://www.cnblogs.com/chenyanbin/p/13293156.html