revit将族载入到项目_cad二次开发的一些简单入门实例

revit将族载入到项目_cad二次开发的一些简单入门实例2019年5月7号

2019年5月7号。Revit版本2017,VS版本2017

Revit提供的MoveElement方法是以自身为基点移动,例如使用MoveElement方法传入参数为(0,0,0)就相当于对移动物体本身不做任何改变。如何实现输入一个坐标系并将物体移动到该坐标上,其实只需要做一个简单的坐标转换即可。本例子涉及到简单的WPF窗体以及窗体数据的传递。

先看看最终效果

revit将族载入到项目_cad二次开发的一些简单入门实例

实现方法:ElementTransformUtils.MoveElement(Document document, ElementId elementToMove, XYZ translation)。

实现功能:选择族实例并移动到指定的世界坐标系。

首先创建数据类DataInfo用于存储窗体上XYZ的值代码如下

 public class DataInfo
    {
        public string Xnum { get; set; }
        public string Ynum { get; set; }
        public string Znum { get; set; }
    }

其次是WPF窗体代码

<Window x:Class="MoveElementBywpf.MoveForm"
             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:MoveElementBywpf"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" Height="120" Width="370" Title="MoveForm">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <Border Background="LightBlue" Margin="2" Padding="2">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <StackPanel Grid.Column="0" Orientation="Horizontal">
                    <TextBlock VerticalAlignment="Center" Margin="2" Padding="2"> X坐标:</TextBlock>
                    <TextBox Name="XText" Width="60" Height="20" Margin="2" Padding="2"></TextBox>
                    <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="2" Padding="2">Y坐标:</TextBlock>
                    <TextBox Name="YText" Width="60" Height="20" Grid.Column="2" Margin="2" Padding="2"></TextBox>
                    <TextBlock VerticalAlignment="Center" Grid.Column="3" Margin="2" Padding="2">Z坐标:</TextBlock>
                    <TextBox Name="ZText" Width="60" Height="20" Grid.Column="3" Margin="2" Padding="2"></TextBox>
                </StackPanel>
            </Grid>
        </Border>
        <Button Grid.Row="1" HorizontalAlignment="Right" Height="20" Width="60" Margin="4" Padding="2" Click="Confirm_Click">确定</Button>
    </Grid>
</Window>

接下来是窗体后台代码,由于实现的功能简单,代码比较少

 public partial class MoveForm : Window
    {
        //数据类,用于存储窗体的信息。
        public DataInfo DataInfo;
        public MoveForm()
        {
            InitializeComponent();
            this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            DataInfo=new DataInfo();
        }

        private void Confirm_Click(object sender, RoutedEventArgs e)
        {
            DataInfo.Xnum = this.XText.Text;
            DataInfo.Ynum = this.YText.Text;
            DataInfo.Znum = this.ZText.Text;
            this.DialogResult = true;
        }
    }

其后,是Revit外部命令类 

public class MoveElementByWpf : IExternalCommand
    {
        DataInfo dataInfo=new DataInfo();
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            Selection sel = uidoc.Selection;
            View view = uidoc.ActiveView;
            ElementId eleId= doc.GetElement(sel.PickObject(ObjectType.Element, "请选择要移动的元素")).Id;
            /
            MoveForm mf=new MoveForm();
            if (mf.ShowDialog()==true)
            {
               dataInfo = mf.DataInfo;
            }
            //目的获取要移动元素的坐标,通过Transform获取
            FamilyInstance fi=doc.GetElement(eleId) as FamilyInstance;
            XYZ nowXyz = fi.GetTransform().Origin;
            //目标坐标
            XYZ target = new XYZ(Convert.ToDouble(dataInfo.Xnum)/ 304.8, Convert.ToDouble(dataInfo.Ynum)/ 304.8, Convert.ToDouble(dataInfo.Znum)/ 304.8);
            //计算目标位置相对于当前物体位置的关系
            XYZ newXyz = VectorHeleper.CalculationVector(target, nowXyz);
            Transaction ts = new Transaction(doc, "移动元素");
            try
            {
                ts.Start();
                ElementTransformUtils.MoveElement(doc, eleId, newXyz);
                ts.Commit();
            }
            catch (Exception ex)
            {
                if (ts.GetStatus() == TransactionStatus.Started)
                {
                    ts.RollBack();
                }

                TaskDialog.Show("Revit", ex.Message);

            }

            return Result.Succeeded;
        }
    }

 最后是计算相对位移的VectorHeleper()类

public static XYZ CalculationVector(XYZ targetXyz,XYZ nowXyz)
        {
            XYZ newXyz=new XYZ(targetXyz.X- nowXyz.X, targetXyz.Y - nowXyz.Y, targetXyz.Z - nowXyz.Z);
            return newXyz;
        }

 最后,需要注意的是并不是所有的族实例都能移动z值的。

今天的文章revit将族载入到项目_cad二次开发的一些简单入门实例分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84057.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注