Revit二次开发_对参数进行文本替换、加前缀、加后缀

我一般都用Dynamo做简单的参数批量修改,但也不能要求项目上每个人都会用Dynamo,这需求偶尔又会有,于是写成插件。

想慢慢写成一个通用一点的参数管理工具,批量写入或者修改什么的,看精力了。

目前功能还是针对特定参数进行文本替换、加前缀、加后缀。

代码:

    class ModifyValue : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Document document = commandData.Application.ActiveUIDocument.Document;

            ModifyValueForm uiForm = new ModifyValueForm(document);
            System.Windows.Interop.WindowInteropHelper thisForm = new System.Windows.Interop.WindowInteropHelper(uiForm)
            {
                Owner = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle
            };
            if (uiForm.ShowDialog() == true)
            {
                using (Transaction tran = new Transaction(document, "修改 参数值"))
                {
                    tran.Start();

                    //0——文本替换
                    //1——加前缀
                    //2——加后缀
                    switch (uiForm.ModifyType)
                    {
                        case 0:
                            foreach (Element element in uiForm.GetElements)
                            {
                                Parameter parameter = element.get_Parameter(uiForm.ParameterDefinition);
                                if (parameter != null)
                                {
                                    parameter.Set(parameter.AsString().Replace(uiForm.Text1, uiForm.Text2));
                                }

                            }
                            break;
                        case 1:
                            foreach (Element element in uiForm.GetElements)
                            {
                                Parameter parameter = element.get_Parameter(uiForm.ParameterDefinition);
                                if (parameter != null)
                                {
                                    if (parameter.AsString() != "")
                                    {
                                        parameter.Set(uiForm.Text1);
                                    }
                                    else
                                    {
                                        parameter.Set(parameter.AsString().Insert(0, uiForm.Text1));
                                    }

                                }
                            }
                            break;
                        case 2:
                            foreach (Element element in uiForm.GetElements)
                            {
                                Parameter parameter = element.get_Parameter(uiForm.ParameterDefinition);
                                if (parameter != null)
                                {
                                    parameter.Set(parameter.AsString() + uiForm.Text1);
                                }
                            }
                            break;
                    }

                    tran.Commit();
                }
            }

            return Result.Succeeded;
        }

    }

WPF XAML部分

<Window x:Class="MyRevitAddin.ModifyValueForm"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyRevitAddin"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800"
        Title="修改参数值" Width="450" Height="550">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="30*"/>
            <RowDefinition Height="350*"/>
            <RowDefinition Height="30*"/>
            <RowDefinition Height="40*"/>
        </Grid.RowDefinitions>
        <DockPanel LastChildFill="True" Margin="10,10,5,0">
            <Label Content="族类别:"/>
            <ComboBox x:Name="Sel_Category" DisplayMemberPath="Name" SelectionChanged="Sel_Category_SelectionChanged"/>
        </DockPanel>
        <DockPanel LastChildFill="True" Margin="5,10,5,0" Grid.Column="1">
            <Label Content="参数类型:"/>
            <ComboBox x:Name="Sel_ParameterType" IsEnabled="False" SelectionChanged="Sel_ParameterType_SelectionChanged">
                <ComboBoxItem Content="类型"></ComboBoxItem>
                <ComboBoxItem Content="实例"></ComboBoxItem>
            </ComboBox>
        </DockPanel>
        <DockPanel LastChildFill="True" Margin="5,10,10,0" Grid.Column="2">
            <Label Content="参数:"/>
            <ComboBox x:Name="Sel_Parameter" DisplayMemberPath="Definition.Name" IsEnabled="False" SelectionChanged="Sel_Parameter_SelectionChanged"/>
        </DockPanel>
        <DockPanel Grid.ColumnSpan="3" LastChildFill="True" Margin="10" Grid.Row="1">
            <Label Content="对象:" VerticalAlignment="Top" DockPanel.Dock="Top"></Label>
            <ListBox x:Name="View_Objects" DisplayMemberPath="KeyInformation" SelectionChanged="View_Objects_SelectionChanged"/>
        </DockPanel>
        <DockPanel Grid.ColumnSpan="3" LastChildFill="False" Margin="10,5,10,10" Grid.Row="3">
            <Button x:Name="Click_Cancel" Content="取消" IsCancel="True" Margin="8,0,0,0" Width="75" DockPanel.Dock="Right"/>
            <Button x:Name="Click_Ok" Content="修改" Width="75" DockPanel.Dock="Right" Click="Click_Ok_Click"/>
        </DockPanel>
        <ComboBox x:Name="Sel_ModifyType" Margin="10,5,5,5" Grid.Row="2" IsEnabled="False" SelectedIndex="0" SelectionChanged="Sel_ModifyType_SelectionChanged">
            <ComboBoxItem Content="替换"></ComboBoxItem>
            <ComboBoxItem Content="前缀"></ComboBoxItem>
            <ComboBoxItem Content="后缀"></ComboBoxItem>
        </ComboBox>
        <TextBox x:Name="Input_Text1" Grid.Column="1" Margin="5" Grid.Row="2" TextWrapping="Wrap" Text="TextBox" IsEnabled="False"/>
        <TextBox x:Name="Input_Text2" Grid.Column="2" Margin="5,5,10,5" Grid.Row="2" TextWrapping="Wrap" Text="TextBox" IsEnabled="False"/>
    </Grid>
</Window>

WPF CS部分

    public partial class ModifyValueForm : Window
    {
        Document _document;
        List<Category> categories = new List<Category>();
        ObservableCollection<Parameter> parameters = new ObservableCollection<Parameter>();
        ObservableCollection<ViewObject> viewObjects = new ObservableCollection<ViewObject>();

        public ModifyValueForm(Document document)
        {
            InitializeComponent();

            _document = document;

            //读取所有类别
            foreach (Category category in _document.Settings.Categories)
            {
                if (category.Id.IntegerValue < 0)
                {
                    FilteredElementCollector cate_Type = new FilteredElementCollector(_document).OfCategory((BuiltInCategory)category.Id.IntegerValue).WhereElementIsElementType();
                    FilteredElementCollector cate_Ins = new FilteredElementCollector(_document).OfCategory((BuiltInCategory)category.Id.IntegerValue).WhereElementIsNotElementType();
                    if (cate_Type.Count() == 0 && cate_Ins.Count() == 0) continue;

                    categories.Add(category);
                }
            }
            categories.Sort((x, y) => x.Name.CompareTo(y.Name));

            Sel_Category.ItemsSource = categories;
            Sel_Parameter.ItemsSource = parameters;
            View_Objects.ItemsSource = viewObjects;
        }

        private void Click_Ok_Click(object sender, RoutedEventArgs e)
        {
            DialogResult = true;
            Close();
        }

        //选择类别后更新数据
        private void Sel_Category_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (Sel_Category.SelectedItem != null)
            {
                Sel_ParameterType.IsEnabled = true;
            }
            RefreshObjects();
            RefreshParameter();
        }

        //选择参数类型后更新数据
        private void Sel_ParameterType_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (Sel_ParameterType != null)
            {
                Sel_Parameter.IsEnabled = true;
            }
            RefreshObjects();
            RefreshParameter();

        }

        //选择参数后允许设置修改模式
        private void Sel_Parameter_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (Sel_Parameter.SelectedItem != null)
            {
                Sel_ModifyType.IsEnabled = true;
                if (Sel_ModifyType.SelectedIndex == 0)
                {
                    Input_Text1.IsEnabled = Input_Text2.IsEnabled = true;
                }
                else
                {
                    Input_Text1.IsEnabled = true;
                    Input_Text2.IsEnabled = false;
                }
            }
            else
            {
                Sel_ModifyType.IsEnabled = Input_Text1.IsEnabled = Input_Text2.IsEnabled = false;
            }
        }

        //选择对象后刷新参数选项
        private void View_Objects_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            RefreshParameter();
        }

        //设置修改模式后允许输入文本框
        private void Sel_ModifyType_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (Sel_ModifyType.IsEnabled)
            {
                if (Sel_ModifyType.SelectedIndex == 0)
                {
                    Input_Text1.IsEnabled = Input_Text2.IsEnabled = true;
                }
                else
                {
                    Input_Text1.IsEnabled = true;
                    Input_Text2.IsEnabled = false;
                }
            }
            //else
            //{
            //    Sel_ModifyType.IsEnabled = Input_Text1.IsEnabled = Input_Text2.IsEnabled = false;
            //}
        }

        //刷新参数选项
        private void RefreshParameter()
        {
            if (Sel_ParameterType.SelectedItem != null)
            {
                parameters.Clear();
                //如果选择了某个对象,使用此对象的参数,否则使用所有对象的共有参数
                if (View_Objects.SelectedItem != null)
                {
                    ViewObject viewObject = View_Objects.SelectedItem as ViewObject;
                    foreach (Parameter parameter in viewObject.Element.Parameters)
                    {
                        if (!parameter.IsReadOnly)
                        {
                            if (parameter.StorageType == StorageType.String)
                            {
                                parameters.Add(parameter);
                            }
                        }
                    }
                }
                else
                {
                    List<int> set1 = new List<int>();
                    foreach (ViewObject viewObject in View_Objects.Items)
                    {
                        List<int> set2 = new List<int>();
                        foreach (Parameter parameter in viewObject.Element.Parameters)
                        {
                            if (!parameter.IsReadOnly)
                            {
                                if (parameter.StorageType == StorageType.String)
                                {
                                    set2.Add(parameter.Id.IntegerValue);
                                }
                            }
                        }
                        if (set1.Count == 0)
                        {
                            set1 = set2.ToList();
                        }
                        else
                        {
                            set1 = set1.Intersect(set2).ToList();
                        }
                    }
                    foreach (int i in set1)
                    {
                        foreach (ViewObject viewObject in View_Objects.Items)
                        {
                            foreach (Parameter parameter in viewObject.Element.Parameters)
                            {
                                if (!parameter.IsReadOnly && parameter.StorageType == StorageType.String && parameter.Id.IntegerValue == i)
                                {
                                    parameters.Add(parameter);
                                    break;
                                }
                            }
                            break;
                        }

                    }
                }
            }
        }

        //刷新对象
        private void RefreshObjects()
        {
            if (Sel_Category.SelectedItem != null && Sel_ParameterType != null)
            {
                viewObjects.Clear();

                FilteredElementCollector elements = new FilteredElementCollector(_document);
                Category selCategory = Sel_Category.SelectedItem as Category;
                elements.OfCategory((BuiltInCategory)selCategory.Id.IntegerValue);
                if (Sel_ParameterType.SelectedIndex == 0)
                {
                    foreach (ElementType elementType in elements.WhereElementIsElementType())
                    {
                        ViewObject viewObject = new ViewObject(elementType);
                        viewObjects.Add(viewObject);
                    }
                }
                if (Sel_ParameterType.SelectedIndex == 1)
                {
                    foreach (Element element in elements.WhereElementIsNotElementType())
                    {
                        ViewObject viewObject = new ViewObject(element);
                        viewObjects.Add(viewObject);
                    }
                }
            }

        }

        #region 公共属性

        public List<Element> GetElements
        {
            get
            {
                List<Element> elements = new List<Element>();
                foreach (ViewObject vo in View_Objects.Items)
                {
                    elements.Add(vo.Element);
                }
                return elements;
            }
        }

        public Definition ParameterDefinition
        {
            get
            {
                if (Sel_Parameter.SelectedItem != null)
                {
                    Parameter parameter = Sel_Parameter.SelectedItem as Parameter;
                    return parameter.Definition;
                }
                return null;
            }
        }

        public int ModifyType
        {
            get
            {
                if (Sel_ModifyType.IsEnabled)
                {
                    return Sel_ModifyType.SelectedIndex;
                }
                return -1;
            }
        }

        public string Text1
        {
            get
            {
                if (Input_Text1.IsEnabled)
                {
                    return Input_Text1.Text;
                }
                return null;
            }
        }

        public string Text2
        {
            get
            {
                if (Input_Text2.IsEnabled)
                {
                    return Input_Text2.Text;
                }
                return null;
            }
        }

        #endregion
    }

    class ViewObject
    {
        public ViewObject(ElementType elementType)
        {
            KeyInformation = elementType.Id + " " + elementType.FamilyName + " : " + elementType.Name;
            Element = elementType;
        }

        public ViewObject(Element element)
        {
            KeyInformation = element.Id + " " + element.Name;
            Element = element;
        }

        public string KeyInformation { get; set; }
        public Element Element { get; set; }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值