Revit开发通过轴网创建柱子


    [Regeneration(RegenerationOption.Manual)]
    [Transaction(TransactionMode.Manual)]
    public class Class1:IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Document doc = commandData.Application.ActiveUIDocument.Document;
            FilteredElementCollector gridFilter = new FilteredElementCollector(doc);

            // 获取所有的轴网
            List<Grid> allGrids = gridFilter.OfClass(typeof(Grid)).Cast<Grid>().ToList();

            //获取轴网的所有交点
            List<XYZ> Points = new List<XYZ>();
            foreach (Grid grid in allGrids)
            {
                Grid currentGrid = grid;
                foreach (Grid grd in allGrids)
                { 
                    IntersectionResultArray ira = null;
                    SetComparisonResult scr = currentGrid.Curve.Intersect(grd.Curve, out ira);
                    if (ira != null)
                    {
                        IntersectionResult ir = ira.get_Item(0);


                        // 判断点是否重复
                        if (!CheckPoint(Points,ir.XYZPoint))
                        {
                            Points.Add(ir.XYZPoint);
                        }
                    }
                }
            }

            // 设置ViewModel
            MyDataContext myDataContext = new MyDataContext(doc);
            MyWin myWin = new MyWin(myDataContext);
            if (myWin.ShowDialog() ?? false)
            {
                // 返回用户选定的建筑柱FamilySymbol
                FamilySymbol symbol = myDataContext.Symbol as FamilySymbol;

                // 返回柱子的顶部标高
                Level topLevel = myDataContext.TopLevel as Level;

                // 返回柱子的底部标高
                Level btmLevel = myDataContext.BtmLevel as Level;

                // 返回顶部偏移
                double topOffset = myDataContext.TopOffset / 304.8;

                // 返回底部偏移
                double btmOffset = myDataContext.BtmOffset / 304.8;

                //启动 事务
                Transaction trans = new Transaction(doc, "Create");
                trans.Start();
                foreach(XYZ p in Points)
                {
                    FamilyInstance column = doc.Create.NewFamilyInstance(p, symbol, btmLevel, StructuralType.NonStructural);
                    //设置底部偏移
                    column.get_Parameter(BuiltInParameter.SCHEDULE_BASE_LEVEL_OFFSET_PARAM).Set(btmOffset);
                    //设置顶部标高
                    column.get_Parameter(BuiltInParameter.SCHEDULE_TOP_LEVEL_PARAM).Set(topLevel.Id);
                    //设置顶部偏移
                    column.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM).Set(topOffset);
                }
                // 提交事务
                trans.Commit();
            }


            return Result.Succeeded;
        }

        private bool CheckPoint(List<XYZ> points, XYZ point)
        {
            bool flag = false;
            foreach (XYZ p in points)
            { 
                if(p.IsAlmostEqualTo(point))
                {
                    flag = true;
                    break;
                }
            }
            return flag;
        }
    }


Xaml 代码

<Window x:Class="CreateColumnByGrids.MyWin"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MyWin" SizeToContent="WidthAndHeight">
    <Window.Resources>
        <Style TargetType="Button">
            <Setter Property="Background" Value="White"/>
            <Setter Property="Width" Value="75" />
            <Setter Property="Margin" Value="5"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Red"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
        <Style TargetType="TextBox">
            <Setter Property="Width" Value="100"/>
            <Setter Property="VerticalContentAlignment" Value="Center" />
            <Setter Property="Margin" Value="5"/>
        </Style>
        <Style TargetType="Label">
            <Setter Property="Margin" Value="5"/>
            <Setter Property="HorizontalAlignment" Value="Right" />
        </Style>
        <Style TargetType="ComboBox">
            <Setter Property="Margin" Value="5"/>    
            <Setter Property="SelectedIndex" Value="0"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Label Content="底部标高:" Grid.Row="0" Grid.Column="0"/>
        <ComboBox Grid.Column="1" Grid.Row="0" Name="btmLvl" ItemsSource="{Binding Path=AllLevels}"
                  DisplayMemberPath="Name" SelectedValuePath="Element" SelectedValue="{Binding Path=BtmLevel,UpdateSourceTrigger=PropertyChanged}"/>


        <Label Content="底部偏移:" Grid.Row="1" Grid.Column="0"/>
        <TextBox Grid.Column="1" Grid.Row="1" Name="btmOffset" Text="{Binding Path=BtmOffset, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  />


        <Label Content="顶部标高:" Grid.Column="0" Grid.Row="2" />
        <ComboBox Grid.Column="1" Grid.Row="2" Name="topLvl" ItemsSource="{Binding Path=AllLevels}" 
                  DisplayMemberPath="Name" SelectedValuePath="Element" SelectedValue="{Binding Path=TopLevel,UpdateSourceTrigger=PropertyChanged}"/>


        <Label Content="顶部偏移:" Grid.Column="0" Grid.Row="3" />
        <TextBox Grid.Column="1" Grid.Row="3" Name="topOffset" Text="{Binding Path=TopOffset,UpdateSourceTrigger=PropertyChanged}"/>


        <Label Content="柱类型:" Grid.Column="0" Grid.Row="4"/>
        <ComboBox Name="symbol" Grid.Column="1" Grid.Row="4" ItemsSource="{Binding Path=AllSymbol}" DisplayMemberPath="Name" SelectedValuePath="Element"/>
        <StackPanel Orientation="Horizontal" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="5" HorizontalAlignment="Right" >
            <Button Name="OK" Content="确定"  Margin="5" Command="{Binding Path= OK_Command}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
            <Button Content="取消"  Margin="5" Command="{Binding Path= Cancel_Command}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}}}"/>
        </StackPanel>
        
    </Grid>
</Window>


窗体代码:

    public partial class MyWin : Window
    { 
        public MyWin()
        {
            InitializeComponent();           
        }
        public MyWin(MyDataContext dataContext)
        {
            InitializeComponent();             
            this.DataContext = dataContext;
        }
    }

ViewModel代码:

    public class MyDataContext : INotifyPropertyChanged 
    {
        private List<ComboBoxData> _AllLevels = new List<ComboBoxData>();
        public List<ComboBoxData> AllLevels { get { return _AllLevels; } private set { _AllLevels = value; } }


        private List<ComboBoxData> _AllSymbol = new List<ComboBoxData>();
        public List<ComboBoxData> AllSymbol { get { return _AllSymbol; } private set { _AllSymbol = value; } }


        private Element symbol = null;
        public Element Symbol
        {
            get 
            {
                if (symbol == null)
                    return _AllSymbol.First().Element;
                return symbol;
            }
            set 
            {
                symbol = value;
                NotifyPropertyChanged("Symbol");
            }
        }


        private Element topLevel = null;
        public Element TopLevel
        {
            get
            {
                if (topLevel == null)
                    return _AllLevels.First().Element;
                return topLevel;
            }
            set
            {
                topLevel = value;
                NotifyPropertyChanged("TopLevel");
                (OK_Command as OK_Command).NotifyPropertyChanged("OK_Command"); 
            }
        }


        private Element btmLevel = null;
        public Element BtmLevel
        {
            get
            {
                if (btmLevel == null)
                    return _AllLevels.First().Element;
                return btmLevel;
            }
            set
            {
                btmLevel = value; 
                NotifyPropertyChanged("BtmLevel");
                (OK_Command as OK_Command).NotifyPropertyChanged("OK_Command"); 
            }
        }


        private double topOffset = 0.0;
        public double TopOffset
        {
            get { return topOffset; }
            set
            {
                topOffset = value;
                NotifyPropertyChanged("TopOffset");
                (OK_Command as OK_Command).NotifyPropertyChanged("OK_Command");
            }
        }


        private double btmOffset = 0.0;
        public double BtmOffset { get { return btmOffset; } 
            set 
            { 
                btmOffset = value; 
                NotifyPropertyChanged("BtmOffset");
                (OK_Command as OK_Command).NotifyPropertyChanged("OK_Command"); 
            }
        }
        public ICommand OK_Command { get; set; }
        public ICommand Cancel_Command { get; set; }


        public MyDataContext(Document doc)
        {


            // 获取所有的标高
            FilteredElementCollector lvlFilter = new FilteredElementCollector(doc);
            List<Level> lvls = lvlFilter.OfClass(typeof(Level)).Cast<Level>().ToList();
            foreach(Element elm in lvls)
            {
                _AllLevels.Add(new ComboBoxData(elm));
            }


            //获取所有建筑柱的FamilySymbol
            FilteredElementCollector symbolFilter = new FilteredElementCollector(doc);
            List<FamilySymbol> symbols = symbolFilter.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_Columns).Cast<FamilySymbol>().ToList();
            foreach (Element elm in symbols)
            {
                _AllSymbol.Add(new ComboBoxData(elm));
            }

            OK_Command = new OK_Command(this);
            Cancel_Command = new Cancel_Command();

        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string Name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(Name));
            }
        }
    }

Ok 命令:

    public class OK_Command : ICommand
    {
        MyDataContext _context;
        public OK_Command(MyDataContext context)
        {
            _context = context;
        }
        public bool CanExecute(object parameter)
        {
            Level topLevel = _context.TopLevel as Level;
            Level btmLevel = _context.BtmLevel as Level;
            if (topLevel == null || btmLevel == null)
                return false;
            if (topLevel.Elevation + _context.TopOffset - (btmLevel.Elevation + _context.BtmOffset) > 0.001)
                return true;
            return false;
        }


        public event EventHandler CanExecuteChanged;


        public void NotifyPropertyChanged(string Name)
        {
            if (CanExecuteChanged != null)
            {
                CanExecuteChanged(this, new PropertyChangedEventArgs(Name));
            }
        }


        public void Execute(object parameter)
        {
            MyWin myWin = parameter as MyWin;
            if (myWin == null)
                return;


            if (myWin.symbol.SelectedItem == null)
                return;
            if (myWin.topLvl.SelectedItem == null)
                return;
            double TopOffset = 0.0;
            if (!double.TryParse(myWin.topOffset.Text, out TopOffset))
            {
                return;
            }
            if (myWin.btmLvl.SelectedItem == null)
                return;
            double BtmOffset = 0.0;
            if (!double.TryParse(myWin.btmOffset.Text, out BtmOffset))
            {
                return;
            }
            Level TopLevel = myWin.topLvl.SelectedValue as Level;
            Level BtmLevel = myWin.btmLvl.SelectedValue as Level;
            if (TopLevel != null && BtmLevel != null)
            {
                if (BtmLevel.Elevation + BtmOffset > TopLevel.Elevation + TopOffset)
                    return;
            }
            else
            {
                return;
            }


            myWin.DialogResult = true;
            myWin.Close();
        }
    }


Cancel命令:

    public class Cancel_Command : ICommand
    {
        public bool CanExecute(object parameter)
        {          
            return true;
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            MyWin myWin = parameter as MyWin;
            myWin.DialogResult = false;
            myWin.Close();
        }
    }


Combobox 数据绑定类:

    public class ComboBoxData
    {
        public Element Element { get; set; }
        public string Name { get; set; }
        public ComboBoxData(Element element)
        {
            this.Element = element;
            this.Name = element.Name;
        }
    }


如有错误欢迎指正

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

源码下载请加qq群480950299


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Revit是一种广泛使用的三维建模软件,它提供了一系列的二次开发工具和API来满足用户对定制化功能的需求。在Revit中,轴号是用来标识建筑物中的各个轴线的一种标识方法。然而,由于建筑设计过程中的种种变化,可能需要重新排列轴号以适应新的设计需求。 通过Revit的二次开发工具,我们可以编写自定义的脚本或插件来实现轴号的重排。首先,我们可以使用API中提供的轴线对象来获取建模环境中的所有轴线。然后,我们可以根据设计需求,对获取到的轴线进行排序和重排。例如,我们可以根据轴线所在位置或者轴线的编号进行排序,并将新的轴号更新到对应的轴线上。 除了重新排序轴号,Revit的二次开发还可以实现其他一些相关的功能,例如批量创建、删除或修改轴线,自动更新轴号等。这些功能可以大大提高设计效率,减少人工操作的繁琐和出错的可能性。 总而言之,Revit的二次开发工具为我们提供了丰富的功能来满足不同的设计需求,包括重排轴号。通过编写脚本或插件,我们可以灵活地对轴号进行重新排序和更新,提高设计效率和准确性。 ### 回答2: Revit二次开发是指在Revit软件的基础上进行二次开发,以满足用户特定需求的定制化功能。其中,重排轴号是Revit二次开发的一种常见需求。 在Revit软件中,轴号用于标识建筑物模型中的垂直或水平轴线。当需要对建筑物进行调整或修改时,轴号的排列顺序可能需要改变。通过Revit二次开发,我们可以实现对轴号进行重排的功能。以下是一种可能的实现方式: 首先,我们需要通过Revit API访问和操作模型中的轴号元素。Revit API是Revit软件的应用程序接口,可以通过编程方式访问、修改和创建Revit模型中的元素。 其次,我们可以编写一个Revit插件或脚本,通过处理轴号元素的相关属性来实现重排。具体而言,我们可以使用Revit API提供的方法获取模型中的轴号元素,并按照用户指定的排序规则进行排序。 在排序过程中,我们可以根据轴线的位置、名称等属性进行排序。一种常见的重排方式是根据轴线的位置进行排序,即按照从左到右、从上到下的顺序对轴号进行排列。 最后,在排序完成后,我们可以更新模型中的轴号元素的属性,以反映新的排序顺序。例如,我们可以更新轴号的显示名称、位置等属性,以便与重排后的顺序保持一致。 通过以上步骤,我们可以实现对Revit模型中轴号的重排。这样,用户就能够根据自己的需求对轴号进行灵活的调整,提高模型数据的可读性和可操作性。Revit二次开发为用户提供了定制功能的灵活性和扩展性,满足了用户对软件个性化定制的需求。 ### 回答3: Revit二次开发中,重排轴号是指对楼层平面图中的轴号进行重新排序和调整。在Revit软件中,默认情况下,轴号是按照其在项目中创建的顺序进行编号的。但是,在实际的建筑项目中,可能会出现需要对轴号进行重新排序的情况,例如添加新的轴号,删除轴号或者调整轴号的顺序。 要实现轴号的重排,可以使用Revit的API功能进行二次开发。首先,通过调用API中的相关方法,可以获取所有轴线的信息和属性,包括轴号的名称、位置和关联的楼层。然后,可以根据需要对这些轴号进行排序,可以按照数字顺序、字母顺序或者其他自定义规则进行排序。 接下来,可以使用API中的方法来修改轴号的属性,包括名称、位置和关联楼层,从而实现轴号的重新排列。在修改轴号属性时,需要注意保持轴号之间的关联关系和相对位置的准确性,以确保项目模型的一致性和准确性。 最后,通过调用API中的方法,可以将修改后的轴号信息重新应用到楼层平面图中,从而更新轴号的显示和标注。这样,就可以实现对Revit项目中轴号的重排功能。 总之,Revit二次开发中的重排轴号是通过调用API功能获取轴号信息,进行排序和修改属性,再重新应用到项目模型中的过程。这样的二次开发可以帮助工程师和设计师更高效地管理和调整项目模型中的轴号,提高工作效率和准确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值