江神文
摘 要: 针对大跨度钢管混凝土拱桥变高度空间桁架主拱,利用Revit平台提出基于上下弦杆节点坐标的建模方法,以族為基础,阐述了模型建立的关键技术,并基于.NET平台,结合Revit API提出了主拱圈建模的二次开发技术,解决了Revit本身无法通过输入三维坐标点方式生成钢管构件的难点,大大提高了主拱圈的建模效率,保证了模型的准确性。
关键词: 钢管拱; Revit; 二次开发; 快速建模
1 引言
从传统二维CAD设计向三维参数化设计转型中,结构专业遇到了较大的阻碍,效率问题是其中重要问题之一。Revit平台提供的结构模型是非常有效的参数化信息载体,其三维设计方法与传统二维绘图方式从根本上发生了转变,结构设计效率问题严重降低了结构设计人员的热情[1]。基于BIM技术的结构设计只需要建立一个模型,不同的阶段无需重复建模,而是将各自的设计信息通过工作集的方法高度集成在同一个模型中,开展协同设计[2]。大跨度钢管混凝土拱桥目前在西南地区跨越峡谷建设越来越多,其拱肋通常采用空间桁架形式,杆件复杂且多,采用以往的二维平面制图,只需要将各个节点坐标导入到CAD中进行点到线。但在Revit平台建模中,确定一个点坐标需要三个互相垂直的平面,主桁架的节点如果都通过这种方式来确定,不但严重影响了建模的效率,而且平面之间的相对位置错误不易检查。为了解决上述问题,借助Revit API(Application Programming Interface)二次开发技术,针对钢管主拱桁架的特点,开发通用插件,具有重要意义。
2 主拱圈参数化建模
在Revit软件中,搭建模型的步骤为:选择族样板—>创建族—>添加族参数—>项目文件中载入族。主拱作为钢管拱的最基本受力结构,建模的目标不仅是能生成可视化的三维信息模型,还要方便生成分析模型,以供分析软件进行调用。采用“公制结构框架—梁和支撑”生成基于两点的钢管族,在项目文档中通过API定制插件生成主拱圈模型
2.1 钢管构件生成
主拱圈拱肋主要构件承重构件均采用钢管,钢管的型号包括φ1360×35、φ900×24、φ600×20等等。直径和壁厚作为钢管构件的共同属性,可以采用“公制结构框架—梁和支撑”样板文件定义钢管族,添加直径d(mm)和壁厚t(mm)两个参数值。为了方便快捷添加众多钢管型号,可以编制和钢管族同名的TXT文件放在同一文件目录下,TXT格式如图 2所示,在项目文件中可以完成一次性载入所有型号的钢管构件。
选取某计算跨径450m钢管混凝土拱桥主拱圈采用等宽变高度空间桁架结构,断面高度从拱顶8m变化到拱脚14m,单片拱肋宽度4m。针对桁架式主拱圈的特殊性,利用Revit API二次开发技术定制插件,一键搭建拱圈模型。
2.2 快速建模
钢管族在项目生成杆件实例,需要给出起终点位置坐标,首先我们通过主拱圈设计图先获取主拱圈上下弦杆的节点坐标,保存成.xls格式文件,一般以拱脚中心作为主拱圈的原点,纵桥向为x轴,横桥向为y轴,竖向为z轴。类Command从IExternalCommand派生,在该类中定义两个动态数组m_beamMaps和m_level分别用来存储当前活动文档中的族类型(SymbolMap类) 和标高(LevelMap类)。
交互窗体CreateBeaml类基于System.Windows.Forms.Form实例化,在窗体除添加Label控件外,需添加4个ComboBox组合框控件和两个dataGridView控件。其中ComboBox组合框用来确认所使用的杆件类型,dataGridView用来导入.xls格式的上下弦杆坐标。Execute()函数运行的主体代码为:
m_revit = commandData.Application;
Transaction tran = new Transaction(m_revit.ActiveUIDocument.Document, “CurvedBeam”);
tran.Start();
bool initializeOK = Initialize();if (!initializeOK){return Autodesk.Revit.UI.Result.Failed;}
CreateBeam displayForm = new CreateBeam(this);displayForm.ShowDialog();
tran.Commit();
因为插件执行需要对文档进行更改,所以创建事务“CurvedBeam”,第一步执行初始化函数Initialize(),为窗体ComboBox组合框插件准备数据。初始化函数需要用到元素逻辑过滤器(LogicalOrFilter)筛选出当前文档中的框架族和标高,其核心代码如下:
ElementClassFilter levelFilter =new ElementClassFilter(typeof(Level)); //过滤标高
ElementClassFilter famFilter =new ElementClassFilter(typeof(Family)); //过滤族
LogicalOrFilter orFilter = new LogicalOrFilter(levelFilter, famFilter); //逻辑或集合
FilteredElementCollector collector = new FilteredElementCollector(doc); //元素收集器
FilteredElementIterator i = collector.WherePasses(orFilter).GetElementIterator(); //过滤出元素