zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
  • 相关阅读:
    Visual Studio 2008 菜单:工具+选项+文本编辑器+HTML+格式,选中“键入时插入属性值引号”
    itemarray的意思
    SQL技巧大全
    IIS调用com组件的权限问题
    网站快速备案法(1小时)
    ASP.NET 2.0中WEB应用程序的部署
    c#中MessageBox的使用
    推荐一款DataGridView的打印解决方案
    使用C#格式化字符串
    关于MSSQL导入导出时主键与约束丢失的问题解决
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/13293156.html
Copyright © 2011-2022 走看看