下载app免费领取会员
文章来源:精讲Revit二次开发
2020年5月10日,西安,晴。
最近几天在研究如何创建钢筋,本来想的是在板上创建钢筋,奈何没有难度。后来在网上看见一个基坑喷锚网筋的模型,确实这个要是使用手动建模是非常费劲的,由于平时接触基坑的项目也不多,正好借此研究一下如何在倾斜的构件里创建钢筋,以备不时之需。当然以下这套方法同样适用于板钢筋的创建。
1、创建钢筋的API
Revit给提供了以下三种,两类创建方法,第一类是根据曲线创建,第二类是根据几何形状创建。
我主要使用了第一类的方法根据曲线创建,来具体看下内容:
第一个doc就不用说了;
第二个选择钢筋类型,对于箍筋需要设置为:RebarStyle.StirupTie.如果对于直线钢筋或纵筋设置为RebarStyle.Standard。这里我们的网筋是直线钢筋所以设置为RebarStyle.Standard。
第三个钢筋形状的类型,案例里我选的是项目里的钢筋。
第四、五个是弯钩的类型,案例里的是直线钢筋,这里都设置成null就行了。
第六个是所要创建钢筋的主体,主体不合适钢筋就会创建在主体外。
这里还有两个Revit的知识点,要在在主体上创建钢筋必须满足以下两个因素:
①常规模型的材质必须为钢筋混凝土
②族参数必须选择可将钢筋附着到主体
第七个是钢筋所在的面向量。
第八个是绘制钢筋的曲线列表(注意:钢筋必须是首尾相连的)。
第九、十个是设置弯钩方向的,因为没有弯钩也就随意选了。
最后两个一个是使用存在的钢筋形状,另一个是创建一个新的钢筋形状。
基坑的面不一定会是矩形但我们创建的钢筋要保证横平竖直,那么我们就不能用连接两条边线的中点的方式去做,而且为了保证构件中部钢筋是均匀分布的,那么钢筋得从中间开始创建。
这里为了保证钢筋是横平竖直的,
帅编用了高中的立体几何及向量的知识,
进行了求解
(此图片和解题过程毫无关系)
得出来了一个公式:
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);
这样就基本实现了这个功能
整体效果(可以在任何面上布置)
细部效果
本文版权归腿腿教学网及原创作者所有,未经授权,谢绝转载。