BIM建筑网
更专业的BIM技术学习网站!


revit二次开发——建连续刚构桥(方法1)

      

其实建连续刚构桥也不是很难,主要是用代码来驱动族而已。好多牛人用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;
 }
 
 }
}

       

微信公众号:xuebim
关注建筑行业BIM发展、研究建筑新技术,汇集建筑前沿信息!
← 微信扫一扫,关注我们+
赞( 0 ) 打赏
BIM建筑网 » revit二次开发——建连续刚构桥(方法1)

评论

评论前必须登录!

 

BIM建筑网,更专业的BIM技术学习网站!

联系我们关于BIM建筑网

觉得文章有用就打赏一下小编吧

支付宝扫一扫打赏

微信扫一扫打赏