Result IExternalCommand.Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Document revitDoc = commandData.Application.ActiveUIDocument.Document; //取得文档 Application revitApp = commandData.Application.Application; //取得应用程序 UIDocument uiDoc = commandData.Application.ActiveUIDocument; //取得当前活动文档 Document document = commandData.Application.ActiveUIDocument.Document; Window1 window1 = new Window1(); //载入族 FamilySymbol familySymbol; using (Transaction tran = new Transaction(uiDoc.Document)) { tran.Start("载入族"); //载入弦杆族 string file = @"C:\Users\zyx\Desktop\2RevitArcBridge\CrossBeam\CrossBeam\source\crossBeam.rfa"; familySymbol = loadFaimly(file, commandData); familySymbol.Activate(); tran.Commit(); } //把这组模型线通过获取首尾点,生成dynamo里的curve List <XYZ> ps = new List <XYZ>(); using (Transaction transaction = new Transaction(uiDoc.Document)) { transaction.Start("选取模型线生成Curve"); Selection sel = uiDoc.Selection; IList <Reference> modelLines = sel.PickObjects(ObjectType.Element, "选一组模型线"); foreach (Reference reference in modelLines) { Element elem = revitDoc.GetElement(reference); ModelLine modelLine = elem as ModelLine; Autodesk.Revit.DB.Curve c = modelLine.GeometryCurve; ps.Add(c.GetEndPoint(0)); ps.Add(c.GetEndPoint(1)); } for (int i = ps.Count - 1; i > 0; i--) { XYZ p1 = ps[i]; XYZ p2 = ps[i - 1]; //注意此处重合点有一个闭合差 if (p1.DistanceTo(p2) < 0.0001) { ps.RemoveAt(i); } } transaction.Commit(); } //做一个revit和dynamo点的转换 DG.CoordinateSystem coordinateSystem = DG.CoordinateSystem.ByOrigin(0, 0, 0);//标准坐标系 List <DG.Point> DGps = new List <DG.Point>(); foreach (XYZ p in ps) { DGps.Add(p.ToPoint(false)); } DG.PolyCurve polyCurve = DG.PolyCurve.ByPoints(DGps); DG.Curve curve = polyCurve as DG.Curve; List <DG.Point> DGCBps = new List <DG.Point>();//横梁的放置点位列表 double StartLength = 0; if (window1.ShowDialog() == true) { //窗口打开并停留,只有点击按键之后,窗口关闭并返回true } //按键会改变window的属性,通过对属性的循环判断来实现对按键的监测 while (!window1.Done) { //选择起点 if (window1.StartPointSelected) { using (Transaction transaction = new Transaction(uiDoc.Document)) { transaction.Start("选择起点"); double r1 = SelectPoint(commandData); DG.Point dgp1 = curve.PointAtParameter(r1); DGCBps.Add(dgp1); StartLength = curve.SegmentLengthAtParameter(r1); transaction.Commit(); } //2、重置window1.StartPointSelected window1.StartPointSelected = false; } if (window1.ShowDialog() == true) { //窗口打开并停留,只有点击按键之后,窗口关闭并返回true } } //在这里根据间距获取到各个点 for (int i = 1; i < window1.cbNumber; i++) { double L = StartLength + window1.cbDistance * i; DG.Point point = curve.PointAtSegmentLength(L); DGCBps.Add(point); MessageBox.Show(i.ToString()); } List <FamilyInstance> instances = new List <FamilyInstance>(); using (Transaction transaction = new Transaction(uiDoc.Document)) { transaction.Start("创建横梁实例"); foreach (DG.Point p in DGCBps) { FamilyInstance familyInstance; familyInstance = CreateFamlyInstance(p, curve, familySymbol, commandData); instances.Add(familyInstance); } transaction.Commit(); } //给每个族实例设置参数 using (Transaction transaction = new Transaction(uiDoc.Document)) { transaction.Start("族实例参数设置"); foreach (FamilyInstance instance in instances) { double h1 = instance.LookupParameter("l1/2").AsDouble(); instance.LookupParameter("l1/2").Set(window1.l1 / 2); instance.LookupParameter("l2").Set(window1.l2); //instance.LookupParameter("h1").Set(window1.l1); //instance.LookupParameter("h2").Set(window1.l1); } transaction.Commit(); } return(Result.Succeeded); }