Revit二次开发将族实例移动到指定位置

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

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

先看看最终效果

Revit二次开发将族实例移动到指定位置_第1张图片

实现方法: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窗体代码


    
        
            
            
        
        
            
                
                    
                    
                    
                
                
                     X坐标:
                    
                    Y坐标:
                    
                    Z坐标:
                    
                
            
        
        
    

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

 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二次开发)