首页/技术分享

Revit技巧 | Revit二次开发能干什么?Revit二次开发案例之常规模型任意斜面创建钢筋

发布于:2024-09-30 10:59:40
12人 分享

    文章来源:精讲Revit二次开发

image.png

    2020年5月10日,西安,晴。

    最近几天在研究如何创建钢筋,本来想的是在板上创建钢筋,奈何没有难度。后来在网上看见一个基坑喷锚网筋的模型,确实这个要是使用手动建模是非常费劲的,由于平时接触基坑的项目也不多,正好借此研究一下如何在倾斜的构件里创建钢筋,以备不时之需。当然以下这套方法同样适用于板钢筋的创建。

    1、创建钢筋的API

    Revit给提供了以下三种,两类创建方法,第一类是根据曲线创建,第二类是根据几何形状创建。

image.png

    我主要使用了第一类的方法根据曲线创建,来具体看下内容:

image.png

    第一个doc就不用说了;

    第二个选择钢筋类型,对于箍筋需要设置为:RebarStyle.StirupTie.如果对于直线钢筋或纵筋设置为RebarStyle.Standard。这里我们的网筋是直线钢筋所以设置为RebarStyle.Standard。

    第三个钢筋形状的类型,案例里我选的是项目里的钢筋。

    第四、五个是弯钩的类型,案例里的是直线钢筋,这里都设置成null就行了。

    第六个是所要创建钢筋的主体,主体不合适钢筋就会创建在主体外。

    这里还有两个Revit的知识点,要在在主体上创建钢筋必须满足以下两个因素:

    ①常规模型的材质必须为钢筋混凝土

image.png

    ②族参数必须选择可将钢筋附着到主体

image.png

    第七个是钢筋所在的面向量。

    第八个是绘制钢筋的曲线列表(注意:钢筋必须是首尾相连的)。

    第九、十个是设置弯钩方向的,因为没有弯钩也就随意选了。

    最后两个一个是使用存在的钢筋形状,另一个是创建一个新的钢筋形状。

    基坑的面不一定会是矩形但我们创建的钢筋要保证横平竖直,那么我们就不能用连接两条边线的中点的方式去做,而且为了保证构件中部钢筋是均匀分布的,那么钢筋得从中间开始创建。

    这里为了保证钢筋是横平竖直的,

    帅编用了高中的立体几何及向量的知识,

    进行了求解

image.png

    (此图片和解题过程毫无关系)

    得出来了一个公式:

    k=-(((x2-x1)*(x1-x0)+(y2-y1)*(y1-y0)+(z2-z1)*(z1-z0))/((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1)));

    xn=k*(x2-x1)+x1;

    yn=k*(y2-y1)+y1;

    zn=k*(z2-z1)+z1;

    终究没有错付数学老师的教导啊

    接下来我们上代码,看看如何实现功能的吧

    ionsel=uiDoc.ion;

    ReferencerefFace=sel.PickObject(ObjectType.Face,"请选择一个面");

    Elementel=doc.GetElement(refFace.ElementId);//获得这个面所在的主体

    PlanarFacepface=el.GetGeometryObjectFromReference(refFace)asPlanarFace;//获得面

    EdgeArrayArrayedgeArray=pface.EdgeLoops;//获得面的边线

    HashSet<Curve>linelist1=newHashSet<Curve>();//获得边线

    foreach(EdgeArrayeddinedgeArray)

    {

    foreach(Edgeedinedd)

    {

    Curveline=ed.AsCurve();

    linelist1.Add(line);//获得面的边线

    }

    }

    Curvecurve1=linelist1.ElementAt(0);//第一根线

    Curvecurve2=null;//第一根线交线

    Curvecurve11=null;//第一根线平行线

    Curvecurve22=null;//第二根线平行线

    foreach(Curvecuinlinelist1)

    {

    try

    {

    if(curve1.Intersect(cu)==SetComparisonResult.Overlap)//第一条线有交点的线

    {

    curve2=cu;

    }

    elseif(curve1.Intersect(cu)==SetComparisonResult.Dist)//第一条线的平行线

    {

    curve11=cu;

    }

    }

    catch

    {

    }

    }

    foreach(Curvecuuinlinelist1)

    {

    try

    {

    if(curve2.Intersect(cuu)==SetComparisonResult.Dist)//第二条线的平行线

    {

    curve22=cuu;

    }

    }

    catch

    {

    }

    }

    //第一条线向平行线做垂线的垂点

    XYZNewXYZ=PointOfPointToLine(curve11.Evaluate(0.5,true),curve1.GetEndPoint(0),curve1.GetEndPoint(1));

    //第二条线向平行线做垂点

    XYZNewXYZ2=PointOfPointToLine(curve22.Evaluate(0.5,true),curve2.GetEndPoint(0),curve2.GetEndPoint(1));

    doubles=-50/304.8;//钢筋偏移距离即保护层厚度

    doubles2=0;//钢筋间距起始点

    doubles4=0;//钢筋间距起始点

    doublesy2=0;//钢筋间距起始点

    doublesy4=0;//钢筋间距起始点

    doubles3=300/304.8;//横向钢筋间距

    doublesy3=300/304.8;//纵向钢筋间距

    XYZnormal=pface.FaceNormal;//面的向量

    XYZxYZ=XYZ.BasisZ;//偏移方向的平面法线

    XYZxYZ2=XYZ.BasisX;//纵向钢筋偏移方向

    Lineline11=Line.Bound(NewXYZ,curve11.Evaluate(0.5,true));//钢筋直线连接中点与垂足

    Lineline1=line11.Offset(s,xYZ)asLine;//钢筋偏移

    Lineline22=Line.Bound(NewXYZ2,curve22.Evaluate(0.5,true));//纵向钢筋

    Lineline222=line22.Offset(s,xYZ2)asLine;//钢筋偏移

    IList<Curve>curves=newList<Curve>();

    curves.Add(line1);

    RebarBarTypebarType=newFilteredElementCollector(doc).OfClass(typeof(RebarBarType)).FirstOrDefault(t=>t.Name=="结构钢筋1")asRebarBarType;

    //横向钢筋

    Rebarrebar=Rebar.FromCurves(doc,Autodesk.Revit.DB.Structure.RebarStyle.Standard,barType,null,null,

    el,normal,curves,RebarHookOrientation.Right,RebarHookOrientation.Left,true,false);

    View3Dview3D=doc.ActiveViewasView3D;

    rebar.SetSolidInView(view3D,true);

    //纵向钢筋

    IList<Curve>curvesy=newList<Curve>();

    curvesy.Add(line222);

    Rebarrebary=Rebar.FromCurves(doc,Autodesk.Revit.DB.Structure.RebarStyle.Standard,barType,null,null,

    el,normal,curvesy,RebarHookOrientation.Right,RebarHookOrientation.Left,true,false);

    rebary.SetSolidInView(view3D,true);

    doublelength=curve1.Length;

    doublegs=length/2/s3;//上下各偏移的根数

    doublelengthy=curve2.Length;//纵向长度

    doublegsy=lengthy/2/s3;//上下各偏移的根数

    for(inti=0;i<gs-1;i++)

    {

    s2=s2+s3;

    s4=s4-s3;

    Lineline2=line1.Offset(s2,normal)asLine;

    Lineline3=line1.Offset(s4,normal)asLine;

    IList<Curve>curves2=newList<Curve>();

    curves2.Add(line2);

    Rebarrebar2=Rebar.FromCurves(doc,Autodesk.Revit.DB.Structure.RebarStyle.Standard,barType,null,null,

    el,normal,curves2,RebarHookOrientation.Right,RebarHookOrientation.Left,true,false);

    rebar2.SetSolidInView(view3D,true);

    IList<Curve>curves3=newList<Curve>();

    curves3.Add(line3);

    Rebarrebar3=Rebar.FromCurves(doc,Autodesk.Revit.DB.Structure.RebarStyle.Standard,barType,null,null,

    el,normal,curves3,RebarHookOrientation.Right,RebarHookOrientation.Left,true,false);

    rebar3.SetSolidInView(view3D,true);

    }

    for(intj=0;j<gsy-1;j++)

    {

    sy2=sy2+sy3;

    sy4=sy4-sy3;

    Lineliney1=line222.Offset(sy2,normal)asLine;

    Lineliney2=line222.Offset(sy4,normal)asLine;

    IList<Curve>curvesy2=newList<Curve>();

    curvesy2.Add(liney1);

    Rebarrebary2=Rebar.FromCurves(doc,Autodesk.Revit.DB.Structure.RebarStyle.Standard,barType,null,null,

    el,normal,curvesy2,RebarHookOrientation.Right,RebarHookOrientation.Left,true,false);

    rebary2.SetSolidInView(view3D,true);

    IList<Curve>curvesy3=newList<Curve>();

    curvesy3.Add(liney2);

    Rebarrebary3=Rebar.FromCurves(doc,Autodesk.Revit.DB.Structure.RebarStyle.Standard,barType,null,null,

    el,normal,curvesy3,RebarHookOrientation.Right,RebarHookOrientation.Left,true,false);

    rebary3.SetSolidInView(view3D,true);

    }

    整个案例的思路:

    1.选择一个要创建钢筋的面,利用这个面找到主体。

    2.获得面的边线,找到边线对应的位置即邻边与对边的关系。

    3.创建钢筋线。

    4.设置保护层厚度,即让钢筋线进行偏移。

    Lineline1=line11.Offset(s,xYZ)asLine;

    5.创建钢筋网,通过复制钢筋线来实现。当然API也提供了钢筋集的创建方法即:固定数量、最大最小间距、间距数量的方法,但不太灵活,因此帅编此处弃用了这种方法。

    使用固定数量API方法为

rebar.SetLayoutAsFixedNumber

    每个参数的意思分别为:根数、间距、法线方向一致与否、第一栏钢筋显示与否、最后一栏钢筋显示与否。

     if (null != rebar)

            {

            //固定数量创建钢筋集

                rebar.SetLayoutAsFixedNumber(2, 6, false, true, true);

            }

    6.将钢筋在当前的三维中显示为实体。

rebar3.SetSolidInView(view3D, true);

    这样就基本实现了这个功能

image.png

    整体效果(可以在任何面上布置)

image.png

    细部效果


转载请注明来源本文地址:https://www.tuituisoft/blog/14552.html

上一篇:

CAD教程 | 「如何用CAD绘制欧式线条?」

下一篇:

CAD教程 | 提升CAD制图速度与效率的方法