其实建连续刚构桥也不是很难,主要是用代码来驱动族而已。好多牛人用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发展、研究建筑新技术,汇集建筑前沿信息!
← 微信扫一扫,关注我们+
评论前必须登录!
注册