Revit二次开发——参数获取和修改

Revit参数获取和修改

参数

参数是记录Revit元素模型属性的对象。在Revit软件中,属性界面中的内容就是Revit参数的一种展现形式。参数作为Revit提供的一种编辑图元参数的通用机制,这里介绍这种机制是如何实现的,以及如何访问参数。

在Revit平台API中,参数在图元类中进行管理。可用以下这些方法访问参数:
●通过遍历某图元所有参数的Element.Parameters集合获取所选图元参数
●通过重载Element.Parameter属性直接访问参数。若参数不存在,则此属性返回null。
●由Element.ParametersMap集合,通过名称访问参数。

若已知名称字符串、内置ID、定义或GUID,则可从图元中检索参数对象。Parameter[String]属性重载根据其本地化名称获取参数,如果需在多个语言区域运行,并要按名称查找参数,那么编写的代码应能处理不同的语言。Parameter [GUID]属性重载根据其全局唯一标识 (GUID) 获取共享参数,当其创建时GUID即已被分配给共享参数。

参数归属
Revit的特点,就是其所有元素,都可以通过参数化驱动,参数之间可以进行计算,而驱动构件的运行,参数应用可划分为以下几个方面:

1、族参数

主要用于定义族的参数信息,用于驱动族的特点,其不会出现在明细表和标记之中,此参数存储在族文件本身。

2、项目参数

是之给当前项目中指定对象添加参数,此参数可以出现在明细表,但无法出现在标记中,此参数存储在项目文件之中。

3、共享参数

是文件外部定义的参数,这些参数需要共享文件来定义,其特点是可以由多个项目和族共享,也可以自由导出到任何明细表和标记中。

4、全局参数

是用于定义全局的参数信息,这个参数可以不归属任何构件,但可以作为其他构件参数中的变量。

参数类型

成员名称说明
Number实数,可包括小数点
Moment力矩
AreaForce面力
LinearForce线性力
Force
YesNo布尔值,表示为Yes或No
Material材料属性值
URL文本字符串,表示网址
Angle角度。内部表示为弧度。用户可见为用户已选定的单位表示
Volume体积。内部表示为十进制立方英尺。用户可见为用户已选择的单位表示
Area面积。内部表示为十进制平方英尺。用户可见为用户已选择的单位表示
Integer整数,或正或负
Invalid参数类型无效,不应使用此值
Length长度。内部表示为十进制英尺。用户可见为用户已选择的单位表示
Text文本字符串

获取/修改参数

元素都有参数,可以通过Element.Parameters获取所有的参数,然后遍历找到需要的参数。也可以通过Element. get_ Parameter( 参数)来获取单个参数,这里“参数”有四种选择:string参数名字. BuiltInParameter参数枚举、Definition参数定义和Guid参数的guid.
注意:使用元素名字查找元素的时候,需要注意本地化的问题,因为不同语言的Revito版本的参数名字是不一样的,比如中文版的叫“长度”的参数,英文叫“Length",同样的程序(比如上面的例子),在英文里面就会出问题。对此,我们建议尽量使用BuiltInParameter。效率上讲,最高的是BuiltInParameter参数,其次是Definition和Guid,最慢的是使用参数名字。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace HelloRevitParameter
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    public class RevitAllParameterCmd : IExternalCommand
    {
        public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message,
            ElementSet elements)
        {
            try
            {
                UIDocument uidoc = commandData.Application.ActiveUIDocument;
                //获取句柄
                Document doc = uidoc.Document;
                //获取文档
                ICollection<ElementId> selIds = uidoc.Selection.GetElementIds();
                //获取选择的图元id集合
                Element element = null;

                if (0 != selIds.Count)
                {
                    element = doc.GetElement(selIds.Last());
                }

                if (null != element)
                {
                    ParameterSet paramSet = element.Parameters;
                    //获取参数集合

                    if (paramSet.IsEmpty)
                     //判空
                    {
                        TaskDialog.Show("参数", "当前元素参数为空!");
                    }
                    else
                    {
                        string msg = string.Empty;
                        IEnumerator pIter = paramSet.GetEnumerator();
                        //循环访问的枚举数
                        while (pIter.MoveNext())
                          //循环输出参数
                        {
                            Parameter param = (Parameter)pIter.Current;
                            //获取枚举数当前位置的元素

                            if (null != param)
                            {
                                msg += string.Format("{0}:{1}\n", param.Definition.Name, param.AsValueString());
                            }
                        }
                        TaskDialog.Show("参数", msg);
                    }
                }
                else
                {
                    TaskDialog.Show("选集", "当前选集没有元素!");
                }

                return Autodesk.Revit.UI.Result.Succeeded;
            }
            catch (Exception ex)
            {
                message = ex.Message;
                return Autodesk.Revit.UI.Result.Failed;
            }
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace HelloRevitParameter
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    public class RevitParameterCmd : IExternalCommand
    {
        public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message,
            ElementSet elements)
        {
            try
            {
                UIDocument uidoc = commandData.Application.ActiveUIDocument;
                Document doc = uidoc.Document;
                ICollection<ElementId> selIds = uidoc.Selection.GetElementIds();
                Element element = null;

                if (0 != selIds.Count)
                {
                    element = doc.GetElement(selIds.Last());
                }

                if (null != element)
                {
                    Parameter param = element.LookupParameter("类别");

                    if (null == param)
                    {
                        TaskDialog.Show("参数", "当前元素没有类别参数!");
                    }
                    else
                    {
                        string msg = string.Empty;
                        msg += string.Format("{0}:{1}\n", param.Definition.Name, param.AsValueString());
                        TaskDialog.Show("参数", msg);
                    }
                }
                else
                {
                    TaskDialog.Show("选集", "当前选集没有元素!");
                }

                return Autodesk.Revit.UI.Result.Succeeded;
            }
            catch (Exception ex)
            {
                message = ex.Message;
                return Autodesk.Revit.UI.Result.Failed;
            }
        }
    }
}

使用BuiltInParameter获取长度

wall wall= null;
Parameter parameterLength = wall. get_ Parameter(BuiltInParameter.CURVE_ELEM_LENGTH);
if (parameterlength ! = null && parameterLength.StorageType = = StorageType . Double)
{
	double length = parameterLength.AsDouble( );
	//使用length
}

2)修改参数
获取到参数之后,进行修改就比较简单了,直接调用Parameter. Set(参数)这个函数。

可以做一些判断
判断该参数是否是ReadOnly (p.IsReadOnly)
判断该参数交互时是否可修改(p.UserModifiable)
判断该参数的StorageType
将要写入该参数的值转换为相应的数据类型,然后Set()

Parameter parameterBase0ffset = wall.get_ Parameter(BuiltInParameter.WALL BASE _OFFSET);
if (parameterBase0ffset ! = null && parameterBase0ffset.StorageType = = StorageType.
Double)
{
	if (! parameterBase0ffset.IsRead0nly)
		bool success = parameterBase0ffset.Set(10);
		if (! success)
		//更新错误报告
		}
	else
	//参数是只读的
}

①设置的值类型一定要和参数的存储类型匹配,如果参数类型是string,我们调用的是
Set(0. 123),就会出错。
②只读参数(即Parameter. IsReadOnly= = true)无法被修改。

### 关于 Revit 二次开发中使用 WPF 的相关信息 在 Revit 二次开发领域,WPF 是一种常用的 UI 技术,用于创建自定义对话框、窗口以及更复杂的交互界面。以下是有关如何在 Revit 中利用 WPF 进行二次开发的一些关键点: #### 使用 WPF 创建自定义窗口 通过 WPF 可以为用户提供更好的用户体验灵活的界面设计能力。下面是一个基于引用的内容来说明如何实现这一目标。 根据已知的信息,在某些情况下可能需要加载外部网页或显示动态内容。例如,可以通过 `WebView2` 来嵌入浏览器控件[^3]。这使得开发者能够轻松集成 HTML 页面或其他在线资源到 Revit 插件中。 ```csharp // XAML 定义部分 <Window x:Class="TestCmd.WebWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TestCmd" xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf" Title="WebWindow" Height="650" Width="1000"> <Grid> <wv2:WebView2 Name="webView"/> </Grid> </Window> // C# 后端逻辑初始化 WebView 控件并导航至指定 URL public partial class WebWindow : Window { public WebWindow() { InitializeComponent(); InitializeWebView("http://www.baidu.com"); } // 初始化 WebView 控件的方法 private async void InitializeWebView(string url) { await webView.EnsureCoreWebView2Async(null); webView.CoreWebView2.Navigate(url); } } ``` 上述代码展示了如何将一个简单的 WebView 组件嵌入到 WPF 应用程序中,并设置其初始页面地址为百度首页[^3]。 #### 利用 WPF 实现预览功能 除了基本的窗体外,还可以借助 WPF 提供的功能模块完成更多高级任务,比如构建实时渲染器或者参数化模型编辑器等复杂组件。对于涉及图形展示的应用场景来说尤为重要的是——能够在不离开当前工作流的前提下即时观察更改效果的能力[^2]。 当涉及到族文件管理时,通常会希望向用户呈现所选选项对应的三维视图以便确认最终成果是否满足预期需求。此时就可以考虑采用类似于以下方式的设计思路:先获取所需几何形状的数据结构形式(即 Element),接着将其转换成适配特定框架所需的格式最后传递给前端进行绘制处理。 ```csharp private void UpdatePreview(Element element){ var geometry = GetGeometryFromElement(element); previewControl.Model = ConvertToModel(geometry); } private ModelData ConvertToModel(GeometryObject geomObj){ ... } ``` 以上伪代码片段示意了更新某个控件上的可视化表示的过程,其中包含了从选定构件提取必要信息并通过适当算法映射为目标平台可识别的对象实例这两个主要阶段。 --- ### 问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤影墨客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值