获取数据方式一(用户选择)
获取风管的面积
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; } } }