Revit开发创建部件和部件视图


在Revit里可以把一部分构件组合起来创建为一个部件,

然后可以创建一些针对这个部件的视图

通过API来创建主要用到两个类

AssemblyInstance 

AssemblyViewUtils 


下面是一个小例子:


Command:

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            IList<Reference> refs = uidoc.Selection.PickObjects(ObjectType.Element);
            List<Element> elems = new List<Element>();
            List<ElementId> ids = new List<ElementId>();
            foreach (Reference r in refs)
            {
                Element e = doc.GetElement(r);
                elems.Add(e);
                ids.Add(e.Id);
            }
            ViewModel myViewModel = new ViewModel(elems);
            AssemblyViewWindow myWin = new AssemblyViewWindow(myViewModel);
            if(myWin.ShowDialog()??false)
            {
                TransactionGroup transGrop = new TransactionGroup(doc, "transGroup");
                transGrop.Start();
                Transaction trans = new Transaction(doc, "trans");
                trans.Start();
                AssemblyInstance assemblyInstance =  AssemblyInstance.Create(doc, ids, myViewModel.Category.Id);                
                trans.Commit();
                trans = new Transaction(doc, "rename");// 
                trans.Start();
                ElementId typeId = assemblyInstance.GetTypeId();
                Element type = doc.GetElement(typeId);
                type.Name = myViewModel.AssemblyInstanceName;
                View3D view3d = AssemblyViewUtils.Create3DOrthographic(doc, assemblyInstance.Id);
                trans.Commit();
                transGrop.Assimilate();                
            }
            return Result.Succeeded;
        }


Window:

<Window x:Class="AssemblyView.AssemblyViewWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="新建部件" SizeToContent="WidthAndHeight">
    <Window.Resources>
        <Style TargetType="Label">
            <Setter Property="Margin" Value="5"/>
            <Setter Property="HorizontalAlignment" Value="Right"/>
        </Style>
        <Style TargetType="TextBox">
            <Setter Property="Margin" Value="5"/>
            <Setter Property="Width" Value="80"/>
        </Style>
        <Style TargetType="ComboBox">
            <Setter Property="Margin" Value="5"/>
            <Setter Property="Width" Value="80"/>
        </Style>
        <Style TargetType="Button">
            <Setter Property="Margin" Value="5"/>
            <Setter Property="Width" Value="75"/>
            <Setter Property="Height" Value="23"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Content="类型名称:" Grid.Column="0" Grid.Row="0"/>
        <TextBox Grid.Column="1" Grid.Row="0" Text="{Binding Path=AssemblyInstanceName, UpdateSourceTrigger=PropertyChanged}"/>
        <Label Content="命名类别:" Grid.Column="0" Grid.Row="1"/>
        <ComboBox  Grid.Column="1" Grid.Row="1" ItemsSource="{Binding Path=Categories, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding Path=Category, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Name"/>
        <StackPanel Orientation="Horizontal" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Right">
            <Button Content="确定" IsEnabled="{Binding Path=IsEnabled, UpdateSourceTrigger=PropertyChanged}" Command="{Binding Path=OK_Command}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=Window}}"/>
            <Button Content="取消" Command="{Binding Path=Cancel_Command}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor ,AncestorType=Window}}" />
        </StackPanel>
    </Grid>
</Window>


    public partial class AssemblyViewWindow : Window
    {
        public AssemblyViewWindow()
        {
            InitializeComponent();
        }
        public AssemblyViewWindow(ViewModel viewModel)
        {
            InitializeComponent();
            this.DataContext = viewModel;
        }
    }


ViewModel:

   public class ViewModel:INotifyPropertyChanged
    {
        private string assemblyInstanceName = string.Empty;
        public string AssemblyInstanceName
        {
            get 
            { 
                return assemblyInstanceName;
            }
            set 
            { 
                assemblyInstanceName = value;
                NotifyPropertyChanged("AssemblyInstanceName");
                CheckOkBtn();
            }
        }
        private List<Category> categories = new List<Category>();
        public List<Category> Categories
        {
            get
            {
                return categories;
            }
        }
        private Category category = null;
        public Category Category
        {
            get 
            { 
                return category;
            }
            set 
            { 
                category = value;
                NotifyPropertyChanged("Category");
                CheckOkBtn();
            }
        }
        private bool isEnabled = false;
        public bool IsEnabled
        {
            get { return isEnabled; }
            set
            {
                isEnabled = value;
            }
        }
        private OK_Command ok_Command = null;
        public OK_Command OK_Command 
        {
            get { return ok_Command; }
        }
        private Cancel_Command cancel_Command = null;
        public Cancel_Command Cancel_Command
        {
            get { return cancel_Command; }
        }
        public ViewModel(List<Element> elems)
        { 
            foreach(Element elm in elems)
            {
                if (categories.Where(m=>m.Name==elm.Category.Name).Count()==0)
                    categories.Add(elm.Category);
            }
            this.cancel_Command = new Cancel_Command();
            this.ok_Command = new OK_Command();
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
        private void CheckOkBtn()
        {
            if (assemblyInstanceName == string.Empty || category == null)
                IsEnabled = false;
            else
                IsEnabled = true;
            NotifyPropertyChanged("IsEnabled");
        }
        
    }


ICommand:

    public class OK_Command : ICommand
    {
        public bool CanExecute(object parameter)
        {
            return true;
        }
        public event EventHandler CanExecuteChanged;
        public void Execute(object parameter)
        {
            AssemblyViewWindow myWin = parameter as AssemblyViewWindow;
            myWin.DialogResult = true;
            myWin.Close();
        }
    }
    public class Cancel_Command : ICommand
    {
        public bool CanExecute(object parameter)
        {
            return true;
        }
        public event EventHandler CanExecuteChanged;
        public void Execute(object parameter)
        {
            AssemblyViewWindow myWin = parameter as AssemblyViewWindow;
            myWin.DialogResult = false;
            myWin.Close();
        }
    }


如有错误欢迎指正

博主会经常更新一些技术文章,请大家多多关注,

源码下载请加qq群480950299


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值