zoukankan      html  css  js  c++  java
  • Revit二次开发之绘制钢筋

    第一次在博客园上写东西,也不知道该写些什么,我想就写点最近项目到遇到的问题吧。

    最近在做一个小项目,具体需求大概是在一个revit模型中的对应的楼板位置绘制钢筋。

    由于刚接触Revit二次开发,之前也没有画过钢筋,所以在网上搜了一些用Revit画钢筋的资料。

    Revit中是提供了用于为混凝土柱、梁、墙、基础墙和结构楼板中的钢筋进行建模的工具。因此我们是可以通过类似于画墙或者柱的方法来画钢筋的。

    通过检索,Revit API 中提供了两种绘制钢筋的方法:

    一是通过给定几何形状创建Rebar.CreateFromRebarShape(Document doc, RebarShape rebarShape, RebarBarType, …)

    二是通过给定曲线创建Rebar.CreateFromCurves(Document doc, …, IList<Curve> curves, …)

     
    第一种CreateFromRebarShape是根据已有的的钢筋几何形状以及钢筋族,选择一个host绘制。后面XYZ origin, XYZ xVec, XYZ yVec这三个参数设置插入点,以及约束条件。用这个方法试了很多次都满足不了我项目上的要求,而且使用这个方法之后,还需要配合Rebar.ScaleToBox(XYZ origin, XYZ xVec, XYZ yVec)方法,把钢筋放置在给定的包围盒内。
     
    放弃了CreateFromRebarShape,选用的是第二种CreateFromCurves方法。该方法同样是需要根据已有的的钢筋几何形状以及钢筋族,选择一个host绘制。

     创建箍筋需要注意的几个输入参数的理解:

    第二个参数(RebarStyle style)是 选择钢筋类型, 对于箍筋需要设置为: RebarStyle.StirupTie.  如果对于直线钢筋或纵筋设置为RebarStyle.Standard。

    bartype,我这里是选择的是项目中加载好的一个钢筋族。

    第4,、5个参数(RebarHookType)是定义筋弯钩类型,此处我设为null。

    第六个参数(host),由于我所话的钢筋较多而且分布在不同的楼板上,所以我这里是在项目中随机选了一个楼板当做host,这样做不会出错,但是会弹出一个警告(如下所示)。

    第七个参数(XYZ norm) 是箍筋坐在平面的法向量方向,由于本项目的楼板都在XY平面,所以直接选取Z轴作为法向量。当然也可以选用curvesList中相交两线叉乘,获得法向量。

    第八个参数(IList<Curve>)当然就是最重要的待绘制的钢筋曲线列表,此处应该注意的是,此处的曲线列表必须是首尾相连放入这个List中,不然是画不出钢筋的。楼主一开始只是把组成钢筋的三个直线无序加入List中,然后就一直报这个错误。

    始终提示,提供的曲线列表是个无效的曲线。找了半天,才发现加入列表的线段不是按顺序首尾相连。害我调试了很久....
     
    最后两个参数应该很好理解,一个是使用存在的钢筋形状,另一个是创建一个新的钢筋形状。
    如果这两个参数分别置成false,true的话,那样每画一次钢筋就会默认创建一个新的钢筋形状;
    而置成true,false的话,程序会提示没有适用的钢筋形状而画不出钢筋;
    楼主这里置成true,true,这样同一类型的钢筋就共用一个新创建的钢筋形状。
                double edge = 1;
                Transaction transT = new Transaction(doc);
                transT.Start("Create Rebar From RebarShape");
                for (int j = 0; j < ptList.Count; j++) {
                    Line steelLine = Line.CreateBound(ptList[j].Item1, ptList[j].Item2);
                    IList<Curve> curves = new List<Curve>();
    
                    XYZ direction = steelLine.Direction;
                    XYZ verticalVector = RotateTo(direction, -Math.PI / 2.0, XYZ.BasisZ);
    
                    XYZ leftEdgePt = ptList[j].Item1 + verticalVector.Normalize() * edge;
                    XYZ rightEdgePt = ptList[j].Item2 + verticalVector.Normalize() * edge;
    
                    Line leftEdgeLine = Line.CreateBound(leftEdgePt, ptList[j].Item1);
                    Line rightEdgeLine = Line.CreateBound(ptList[j].Item2, rightEdgePt);
                    curves.Add(leftEdgeLine);
                    curves.Add(steelLine);
                    curves.Add(rightEdgeLine);
    
                    XYZ normal = XYZ.BasisZ;
                    RebarBarType bartype = new FilteredElementCollector(doc).OfClass(typeof(RebarBarType)).FirstOrDefault(t => t.Name == SystemInfoConfig.SteelTypeName) as RebarBarType;
    
                    var instanceFitler = new ElementClassFilter(typeof(Floor));
                    var collector = new FilteredElementCollector(doc);
                    Element host = collector.WherePasses(instanceFitler).FirstOrDefault();
    
                    Rebar newRebar = Rebar.CreateFromCurves(doc, RebarStyle.Standard, bartype, null, null, host, normal, curves, RebarHookOrientation.Left, RebarHookOrientation.Left, true, true);
                }
                transT.Commit();
    最后的效果,如下图所示:
     
    由于想在俯视图上能看到这些钢筋,所以在画的时候,故意将钢筋的Z坐标稍微调高了一点,使得钢筋不在楼板中,以便看到效果,红色显示的就是所画的钢筋。
     

    楼主是初学者,有缺漏或者不对的地方,欢迎大家补充和纠正。

     

  • 相关阅读:
    优化SQL查询:如何写出高性能SQL语句
    提高SQL执行效率的16种方法
    Spring Ioc DI 原理
    java内存泄漏
    转:js闭包
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Best Time to Buy and Sell Stock with Cooldown
    LeetCode Length of Longest Fibonacci Subsequence
    LeetCode Divisor Game
    LeetCode Sum of Even Numbers After Queries
  • 原文地址:https://www.cnblogs.com/detail/p/3570929.html
Copyright © 2011-2022 走看看