下载app免费领取会员
最近有看到粉丝让我写一篇关于柱子一键翻模的案例,我答应粉丝的就一定会行动,这不趁着周末赶紧码代码和测试,然后就顺理成章,这篇文章的内容就信手拈来啦!
说起一键翻模,咱要先理清一下思路,如何进行翻模,现在市场上的传统的翻模方法和工具非常多,各种方法都有,我总结的有以下几种方法可供选择:
和CAD开发结合,利用CAD开发导出线数据通过Revit开发进行读取和直接生成模型。
在Revit里通过链接CAD然后通过识别图层的方式进行获取线数据,再进行模型生成。
在Revit里通过链接CAD然后通过点击线来获取该图层下的线数据,进行模型生成。
第一种办法比较灵活,但涉及CAD开发以及需要数据传输比较麻烦(主要是帅编的CAD开发最近刚自学,还不熟练!!);第二种办法是适合设计部内部使用的,需要知道各个图层的命名规则,这样可以省去点选图层的步骤;第三种是这次讲解使用的方法,适合对图纸图层不太熟悉,需要手动去拾取图层的办法。

下面是全部的源代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.IO;
usingSystem.Data;
usingAutodesk.Revit;
usingAutodesk.Revit.UI;
usingAutodesk.Revit.UI.Selection;
usingAutodesk.Revit.DB;
usingAutodesk.Revit.DB.Architecture;
usingAutodesk.Revit.DB.Mechanical;
usingAutodesk.Revit.DB.Plumbing;
usingAutodesk.Revit.DB.Electrical;
usingAutodesk.Revit.DB.Structure;
usingAutodesk.Revit.ApplicationServices;
usingSystem.Data.SqlClient;
//usingTeigha.Geometry;
//usingTeigha.Runtime;
//usingTeigha.DatabaseServices;
namespacezpxzpx
{[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)][Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)][Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
classGenerateColu:IExternalCommand
{
publicAutodesk.Revit.UI.ResultExecute(ExternalCommandDatacommandData,refstringmessage,Autodesk.Revit.DB.ElementSetelements)
{
//创建应用程序对象
Autodesk.Revit.ApplicationServices.Applicationapp=commandData.Application.Application;
//创建文档对象
Autodesk.Revit.DB.Documentdoc=commandData.Application.ActiveUIDocument.Document;
//创建应用程序对象
Autodesk.Revit.UI.UIApplicationuiapp=commandData.Application;
//创建文档对象
Autodesk.Revit.UI.UIDocumentuiDoc=uiapp.ActiveUIDocument;
//开始事务
Autodesk.Revit.DB.Transactionts=newAutodesk.Revit.DB.Transaction(doc,"柱子翻模");
ts.Start();
Referencer=uiDoc.Selection.PickObject(ObjectType.PointOnElement);//获取对象
stringss=r.ConvertToStableRepresentation(doc);//转化为字符串
Elementelem=doc.GetElement(r);
GeometryElementgeoElem=elem.get_Geometry(newOptions());//几何图元
GeometryObjectgeoObj=elem.GetGeometryObjectFromReference(r);//几何对象
//获取选中的cad图层
CategorytargetCategory=null;
ElementIdgraphicsStyleId=null;
//判断所选取的几何对象样式不为元素无效值
if(geoObj.GraphicsStyleId!=ElementId.InvalidElementId)
{
graphicsStyleId=geoObj.GraphicsStyleId;
GraphicsStylegs=doc.GetElement(geoObj.GraphicsStyleId)asGraphicsStyle;//获得所选对象图形样式
if(gs!=null)
{
targetCategory=gs.GraphicsStyleCategory;//图层
varname=gs.GraphicsStyleCategory.Name;//图层名字}
}
//隐藏选中的cad图层
if(targetCategory!=null)
{
doc.ActiveView.SetVisibility(targetCategory,false);
}
CurveArraycurveArray=newCurveArray();
List<double>listdb=newList<double>();
foreach(vargObjingeoElem)
{
GeometryInstancegeomInstance=gObjasGeometryInstance;
//GeometryInstance代表Revit在默认配置中存储的一组几何,然后由于元素的属性而转换到正确的位置。
//遇到GeometryInstances的最常见情况是在Family实例中。Revit使用GeometryInstances允许它存储给定族的几何图形的单个副本,并在多个实例中重复使用。
//请注意,并非所有Family实例都将包含GeometryInstances。
//当Revit需要为给定实例制作族几何的唯一副本时(由于局部连接,相交以及与实例放置相关的其他因素的影响),将不会遇到GeometryInstance;
//相反,实体几何将在层次结构的顶层找到。GeometryInstance提供了通过GetSymbolGeometry()和GetInstanceGeometry()方法读取其几何的功能。
//这些方法返回另一个Autodesk.Revit.DB.GeometryElement,可以像第一级返回一样对其进行解析。
//坐标转换。如果选择的是“自动-中心到中心”,或者移动了importInstance,需要进行坐标转换
Transformtransform=geomInstance.Transform;
if(null!=geomInstance)
{
foreach(varinsObjingeomInstance.SymbolGeometry)//坐标空间
{
if(insObj.GraphicsStyleId.IntegerValue!=graphicsStyleId.IntegerValue)
continue;
//线类型
if(insObj.GetType().ToString()=="Autodesk.Revit.DB.PolyLine")
{
PolyLinepolyLine=insObjasPolyLine;
IList<XYZ>points=polyLine.GetCoordinates();//获取坐标点
XYZpMax=polyLine.GetOutline().MaximumPoint;
XYZpMin=polyLine.GetOutline().MinimumPoint;
//长和宽
doubleb=Math.Abs(pMin.X-pMax.X);
doubleh=Math.Abs(pMin.Y-pMax.Y);
XYZpp=pMax.Add(pMin)/2;//柱子的中点坐标
pp=transform.OfPoint(pp);//坐标转换
CreatColu(doc,pp,b,h);//生成柱子
}
}
}
}
ts.Commit();
returnResult.Succeeded;
}
//生成柱子
privatevoidCreatColu(Documentdoc,XYZpoint,doubleb,doubleh)
{
FilteredElementCollectorfil=newFilteredElementCollector(doc);
fil.OfClass(typeof(FamilySymbol));
stringbh=CutDecimalWithN(b*304.8,4).ToString()+""+"x"+""+CutDecimalWithN(h*304.8,4);
List<FamilySymbol>listFa=newList<FamilySymbol>();
foreach(FamilySymbolfainfil)
{
if(fa.GetParameters("族名称")[0].AsString()=="砼矩形柱")
{
listFa.Add(fa);
}
}
inti=0;
boolbo=false;
intj=0;
for(i=0;i<listFa.Count;i++)
{
if(bh==listFa[i].Name)
{
bo=true;
j=i;
}
}
if(bo==true)
{
doc.Create.NewFamilyInstance(point,listFa[j],StructuralType.Column);
}
else
{
FamilySymbolfam=listFa[0];
ElementTypecoluType=fam.Duplicate(bh);
coluType.GetParameters("截面宽度")[0].Set(b);
coluType.GetParameters("截面高度")[0].Set(h);
FamilySymbolfs=coluTypeasFamilySymbol;
doc.Create.NewFamilyInstance(point,fs,StructuralType.Column);
}
}

看起来是真的很长……拉起来也怪费劲的!不过只要你测试一下,就会发现这个代码的非常神奇的自动建模的效果!找了一个真实的例子,试了一下,减值完美的爽到到飞起!你要不要一起来试一下?
转载请注明来源本文地址:https://www.tuituisoft/bim/7477.html
上一篇:没有了
下一篇:没有了