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

24 篇文章 0 订阅
12 篇文章 1 订阅

如有不明白,请qq254033230询问。        

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


       

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值