上一个方法对于直线的连续刚构桥行得通,但对于有平纵曲线的连续刚构桥还是行不通,这里主要是族的原因,因为带平纵曲线的连续刚构桥每一个节段都可以算作一个异形结构。人工建死族的话,耗时耗力,而且效果还不好。这就需要用到二次开发来解决。
首先得明确模型要达到怎样的一个效果,需要用到哪些数学知识。
这里要达到的效果:
1)梁段截面垂直于路线的平曲线,这点很重要,因为很多人直接用空间曲线来建模,另外用上自适应构件族,这直接导致截面与空间曲线垂直,而不是与平曲线垂直
2)要满足竖曲线的要素,就需要将截面沿z方向移动到竖向位置
3)要想达到上面的效果,首先第1点,通过自适应构件族里的通过点来生成线,每个点是梁段截面中心点的位置,然后把截面族放到相应点的位置,并旋转截面,使截面和每点的切线垂直,然后将移动到三维空间点位,最后生成Form结构。
具体实现的方法的类:
class CreatJM
{
/// <summary>
/// 创建截面
/// </summary>
/// <param name="familyDoc"></param>
/// <param name="revitDoc"></param>
/// <param name="revitApp"></param>
/// <param name="i"></param>
/// <param name="filePath1"></param>
/// <param name="filePath2"></param>
/// <returns></returns>
public Family CreatFamiliesItem(Document familyDoc, Document revitDoc, Application revitApp, int i, string filePath1, string filePath2)
{
FamilyInstance famIns1;
FamilyInstance famIns2;
FamilyInstance famIns3;
FamilyInstance famIns4;
Plane plane1 = new Plane();
Plane plane2 = new Plane();
using (Transaction transaction1 = new Transaction(familyDoc))
{
transaction1.Start("主题");
//在下面添加主要代码内容
#region 平曲线
ReferencePointArray refPointArray = new ReferencePointArray();
for (int j = 0; j < ListData.ListXYZ_X.Count; j++)
{
ReferencePoint referencePoint = familyDoc.FamilyCreate.NewReferencePoint(new XYZ(ListData.ListXYZ_X[j], ListData.ListXYZ_Y[j], 0)); //在体量族里建成空间参照点
refPointArray.Append(referencePoint);
}
CurveByPoints curve = familyDoc.FamilyCreate.NewCurveByPoints(refPointArray); //在体量族里将空间参照点串成空间曲线
#endregion
#region 纵曲线
ReferencePointArray refPointArray2 = new ReferencePointArray();
for (int j = 0; j < ListData.ListXYZ_X.Count; j++)
{
ReferencePoint referencePoint2 = familyDoc.FamilyCreate.NewReferencePoint(new XYZ(ListData.ListXYZ_X[j], ListData.ListXYZ_Y[j], ListData.ListXYZ_Z[j])); //在体量族里建成空间参照点
refPointArray2.Append(referencePoint2);
}
CurveByPoints curve2 = familyDoc.FamilyCreate.NewCurveByPoints(refPointArray2); //在体量族里将空间参照点串成空间曲线
//ReferenceArray path2 = new ReferenceArray();
//path2.Append(curve2.GeometryCurve.Reference);
#endregion
famIns1 = LocationFamilyInstance(familyDoc, filePath1, curve2.GetPoints().get_Item(i).Position, (curve.GeometryCurve as HermiteSpline).Tangents[i], i);
famIns2 = LocationFamilyInstance(familyDoc, filePath1, curve2.GetPoints().get_Item(i + 1).Position, (curve.GeometryCurve as HermiteSpline).Tangents[i + 1], i + 1);
famIns3 = LocationFamilyInstance2(familyDoc, filePath2, curve2.GetPoints().get_Item(i).Position, (curve.GeometryCurve as HermiteSpline).Tangents[i], i);
famIns4 = LocationFamilyInstance2(familyDoc, filePath2, curve2.GetPoints().get_Item(i + 1).Position, (curve.GeometryCurve as HermiteSpline).Tangents[i + 1], i + 1);
plane1 = new Plane((curve.GeometryCurve as HermiteSpline).Tangents[i], curve.GetPoints().get_Item(i).Position);
plane2 = new Plane((curve.GeometryCurve as HermiteSpline).Tangents[i + 1], curve.GetPoints().get_Item(i + 1).Position);
familyDoc.Delete(curve.Id);
familyDoc.Delete(curve2.Id);
refPointArray.Clear();
refPointArray2.Clear();
transaction1.Commit();
}
using (Transaction transaction2 = new Transaction(familyDoc))
{
transaction2.Start("主题");
//在下面添加主要代码内容
ReferenceArray profiles0 = GetReferenceArrayFromFamilyInstance(familyDoc, famIns1, plane1);
ReferenceArray profiles1 = GetReferenceArrayFromFamilyInstance(familyDoc, famIns2, plane2);
ReferenceArray profiles2 = GetReferenceArrayFromFamilyInstance(familyDoc, famIns3, plane1);
ReferenceArray profiles3 = GetReferenceArrayFromFamilyInstance(familyDoc, famIns4, plane2);
ReferenceArrayArray profilesArray = new ReferenceArrayArray();
profilesArray.Append(profiles0);
profilesArray.Append(profiles1);
Form form = familyDoc.FamilyCreate.NewLoftForm(true, profilesArray);
ReferenceArrayArray profilesArray2 = new ReferenceArrayArray();
profilesArray2.Append(profiles2);
profilesArray2.Append(profiles3);
Form form2 = familyDoc.FamilyCreate.NewLoftForm(false, profilesArray2);
string paramName = "材质";
familyDoc.FamilyManager.AddParameter(paramName, BuiltInParameterGroup.PG_MATERIALS, ParameterType.Material, true);
transaction2.Commit();
Family loadedFamily = familyDoc.LoadFamily(revitDoc, new ProjiectFamLoadOption());
return loadedFamily;
}
}
/// <summary>
/// 得到截面的referenceArray
/// </summary>
/// <param name="familyDoc"></param>
/// <param name="famIns"></param>
/// <param name="plane"></param>
/// <returns></returns>
private ReferenceArray GetReferenceArrayFromFamilyInstance(Document familyDoc, FamilyInstance famIns, Plane plane)
{
ReferenceArray profilesArray = new ReferenceArray();
Options opt = new Options();
IList<Curve> curves1 = new List<Curve>();
GeometryElement e = famIns.get_Geometry(opt);
foreach (GeometryObject obj in e)
{
GeometryInstance geoInstance = obj as GeometryInstance;
GeometryElement geoElement = geoInstance.GetInstanceGeometry();
foreach (GeometryObject obj2 in geoElement)
{
if (obj2.GetType().ToString() == "Autodesk.Revit.DB.Line" || obj2.GetType().ToString() == "Autodesk.Revit.DB.Arc")
{
Curve curve = obj2 as Curve;
ModelCurve modelcurve = familyDoc.FamilyCreate.NewModelCurve(curve, SketchPlane.Create(familyDoc, plane));
profilesArray.Append(modelcurve.GeometryCurve.Reference);
}
}
}
return profilesArray;
}
/// <summary>
/// 把外截面族准确的放在相应位置
/// </summary>
/// <param name="familyDoc"></param>
/// <param name="filePath"></param>
/// <param name="location"></param>
/// <param name="normal"></param>
/// <param name="i"></param>
/// <returns></returns>
private FamilyInstance LocationFamilyInstance(Document familyDoc, string filePath, XYZ location, XYZ normal, int i)
{
FamilySymbol familySymbol = null;
bool modelCurveZhu = familyDoc.LoadFamilySymbol(filePath, System.IO.Path.GetFileNameWithoutExtension(filePath), out familySymbol); //这里的族一定要有类型才行
familySymbol.Activate(); //激活族类型
List<Autodesk.Revit.Creation.FamilyInstanceCreationData> list = new List<Autodesk.Revit.Creation.FamilyInstanceCreationData>();
list.Add(new Autodesk.Revit.Creation.FamilyInstanceCreationData(location, familySymbol, StructuralType.NonStructural));
var familyInstancesIds = familyDoc.FamilyCreate.NewFamilyInstances2(list);
FamilyInstance familyInstance = familyDoc.GetElement(familyInstancesIds.ElementAt(0)) as FamilyInstance;
LocationPoint point = familyInstance.Location as LocationPoint;
Line line1 = Line.CreateBound(location, new XYZ(location.X, location.Y, (location.Z + 1)));
double angle = normal.AngleTo(new XYZ(1, 0, 0));
//Math.Acos(normal.DotProduct(new XYZ(1, 0, 0)));
if (normal.CrossProduct(new XYZ(1, 0, 0)).Z < 0)
{
point.Rotate(line1, angle);
}
else
{
point.Rotate(line1, -angle);
}
IList<Parameter> listParameters = familyInstance.GetParameters("H");
listParameters[0].Set(ListData.List_height[i]);
return familyInstance;
}
/// <summary>
/// 把内截面族放到相应位置
/// </summary>
/// <param name="familyDoc"></param>
/// <param name="filePath"></param>
/// <param name="location"></param>
/// <param name="normal"></param>
/// <param name="i"></param>
/// <returns></returns>
private FamilyInstance LocationFamilyInstance2(Document familyDoc, string filePath, XYZ location, XYZ normal, int i)
{
FamilySymbol familySymbol = null;
bool modelCurveZhu = familyDoc.LoadFamilySymbol(filePath, System.IO.Path.GetFileNameWithoutExtension(filePath), out familySymbol); //这里的族一定要有类型才行
familySymbol.Activate(); //激活族类型
List<Autodesk.Revit.Creation.FamilyInstanceCreationData> list = new List<Autodesk.Revit.Creation.FamilyInstanceCreationData>();
list.Add(new Autodesk.Revit.Creation.FamilyInstanceCreationData(location, familySymbol, StructuralType.NonStructural));
var familyInstancesIds = familyDoc.FamilyCreate.NewFamilyInstances2(list);
FamilyInstance familyInstance = familyDoc.GetElement(familyInstancesIds.ElementAt(0)) as FamilyInstance;
LocationPoint point = familyInstance.Location as LocationPoint;
Line line1 = Line.CreateBound(location, new XYZ(location.X, location.Y, (location.Z + 1)));
double angle = normal.AngleTo(new XYZ(1, 0, 0));
//Math.Acos(normal.DotProduct(new XYZ(1, 0, 0)));
if (normal.CrossProduct(new XYZ(1, 0, 0)).Z < 0)
{
point.Rotate(line1, angle);
}
else
{
point.Rotate(line1, -angle);
}
IList<Parameter> listParameters = familyInstance.GetParameters("Hi1");
listParameters[0].Set(ListData.List_Hi1[i]);
IList<Parameter> listParameters1 = familyInstance.GetParameters("Hi5");
listParameters1[0].Set(ListData.List_Hi5[i]);
IList<Parameter> listParameters2 = familyInstance.GetParameters("T");
listParameters2[0].Set(ListData.List_t[i]);
IList<Parameter> listParameters3 = familyInstance.GetParameters("H");
listParameters3[0].Set(ListData.List_height[i]);
return familyInstance;
}
}
具体效果见视频:
http://v.youku.com/v_show/id_XMjgwMjcwMjY3Ng==.html?spm=a2hzp.8244740.userfeed.5!4~5~5~5!3~5~A
微信公众号:xuebim
关注建筑行业BIM发展、研究建筑新技术,汇集建筑前沿信息!
← 微信扫一扫,关注我们+
评论前必须登录!
注册