[摘要] 其实建连续刚构桥也不是很难,主要是用代码来驱动族而已。好多牛人用dynamo来做这件事情,我觉得也挺好,我也用过dynamo来
其实建连续刚构桥也不是很难,主要是用代码来驱动族而已。好多牛人用dynamo来做这件事情,我觉得也挺好,我也用过dynamo来操作过,但是用起来还是没有插件爽。
其实代码也挺简单的,这里就直接放主要的代码吧。核心就是把族放在相应位置,然后获取族参数,并修改族参数。
最后效果视频见:http://v.youku.com/v_show/id_XMTg2MTY2NDU4NA==.html?spm=a2hzp.8253869.0.0
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Autodesk.Revit.UI;using Autodesk.Revit.DB;using Autodesk.Revit.UI.Selection;using Autodesk.Revit.ApplicationServices;namespace BuildBridgeQuick{ [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)] [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)] public class Class1 : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Document revitDoc = commandData.Application.ActiveUIDocument.Document; //取得文档 Application revitApp = commandData.Application.Application; //取得应用程序 UIDocument uiDoc = commandData.Application.ActiveUIDocument; //取得当前活动文档 //选择箱梁单室的实例 Selection sel = uiDoc.Selection; Reference ref1 = sel.PickObject(ObjectType.Element,"选择一个变截面箱梁实例"); Element elem = revitDoc.GetElement(ref1); FamilyInstance familyInstance = elem as FamilyInstance; if (familyInstance == null) { TaskDialog.Show("错误1","没有选择箱梁单室,请重新选择!"); //注意这里的代码要重新优化 } //提取出族类型名称,并把类型名称放到窗口textBox里 FamilySymbol symbol = familyInstance.Symbol; TempName.FamInsName = symbol.Name; //打开窗口 Form1 form1 = new Form1(); form1.ShowDialog(); List<ElementId> list = new List<ElementId>(); list.Add(elem.Id); ICollection<ElementId> elementIds = list; //获取相应的截面参数 IList<Parameter> list1 = familyInstance.GetParameters("iH"); //变截面箱梁i截面的高度 Parameter param1 = list1[0]; IList<Parameter> list2 = familyInstance.GetParameters("iHI5"); //变截面箱梁i截面底板的高度 Parameter param2 = list2[0]; IList<Parameter> list3 = familyInstance.GetParameters("iT"); //变截面箱梁i截面腹板的宽度 Parameter param3 = list3[0]; IList<Parameter> list4 = familyInstance.GetParameters("iHI1"); //变截面箱梁i截面顶板的高度 Parameter param4 = list4[0]; IList<Parameter> list5 = familyInstance.GetParameters("jH"); //变截面箱梁j截面的高度 Parameter param5 = list5[0]; IList<Parameter> list6 = familyInstance.GetParameters("jHI5"); //变截面箱梁j截面底板的高度 Parameter param6 = list6[0]; IList<Parameter> list7 = familyInstance.GetParameters("jT"); //变截面箱梁j截面腹板的宽度 Parameter param7 = list7[0]; IList<Parameter> list8 = familyInstance.GetParameters("jHI1"); //变截面箱梁j截面顶板的高度 Parameter param8 = list8[0]; IList<Parameter> list9= familyInstance.GetParameters("BeamLength"); //变截面箱梁节段长度 Parameter param9 = list9 [0]; IList<Parameter> list10 = familyInstance.GetParameters("detZ"); //变截面箱梁两个截面的高差 Parameter param10 = list10[0]; IList<Parameter> list11 = familyInstance.GetParameters("detY"); //变截面箱梁两个截面的高差 Parameter param11 = list11[0]; int j = 0; for (int i = 0; i < (Convert.ToInt32(ListData.List_SJGC.Count) - 1); i++) { j =i+1; #region 将表格的族参数赋予给对应的族参数 Transaction transaction1 = new Transaction(revitDoc); transaction1.Start("改变族参数"); param1.Set(ListData.List_XLG[i] / 304.8); //变截面箱梁i截面的高度 param2.Set(ListData.List_DBH[i] / 304.8); //变截面箱梁i截面底板的高度 param3.Set(ListData.List_FBH[i] / 304.8); //变截面箱梁i截面腹板的宽度 param4.Set(ListData.List_TBH[i] / 304.8); //变截面箱梁i截面顶板的高度 param5.Set(ListData.List_XLG[j] / 304.8); //变截面箱梁j截面的高度 param6.Set(ListData.List_DBH[j] / 304.8); //变截面箱梁j截面底板的高度 param7.Set(ListData.List_FBH[j] / 304.8); //变截面箱梁j截面腹板的宽度 param8.Set(ListData.List_TBH[j] / 304.8); //变截面箱梁j截面顶板的高度 param9.Set(ListData.List_JDCD[j] / 304.8); //变截面箱梁节段长度 param10.Set(ListData.List_SJGC[i] / 304.8 - ListData.List_SJGC[j] / 304.8); //变截面箱梁两个z截面的高差 param11.Set(ListData.List_Y[i] / 304.8 - ListData.List_Y[j] / 304.8); //变截面箱梁两个Y截面的高差 transaction1.Commit(); #endregion #region 将改变参数后的族放到相应位置 Transaction transaction2 = new Transaction(revitDoc); transaction2.Start("将族复制到相应位置"); XYZ point = new XYZ(ListData.List_X[i]/304.8, ListData.List_Y[i] / 304.8, ListData.List_SJGC[i] / 304.8); LocationPoint familyInstancePoint = familyInstance.Location as LocationPoint; XYZ tanslation = new XYZ(ListData.List_X[i] / 304.8 - familyInstancePoint.Point.X, ListData.List_Y[i] / 304.8 - familyInstancePoint.Point.Y, ListData.List_SJGC[i] / 304.8 - familyInstancePoint.Point.Z); ElementTransformUtils.CopyElements(revitDoc, elementIds, tanslation); transaction2.Commit(); #endregion } //把存放在ListData里的数据清除掉 ListData.List_DBH.Clear(); ListData.List_FBH.Clear(); ListData.List_JDCD.Clear(); ListData.List_SJGC.Clear(); ListData.List_TBH.Clear(); ListData.List_X.Clear(); ListData.List_XLG.Clear(); ListData.List_Y.Clear(); return Result.Succeeded; } }}