revit开发__箱梁粱体生成
生活随笔
收集整理的這篇文章主要介紹了
revit开发__箱梁粱体生成
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
revit開發__箱梁粱體生成
- 問題描述
- 解決思路
- 代碼實現
- 運行效果
問題描述
對于梁式橋,因為平豎曲線的存在,無法簡單地用拉伸去模擬橋梁的形狀。如果強行用拉伸去生成,粱段與粱段之間會出現缺口,中心線也變成一段段折線,效果不理想。
解決思路
在曲線和曲面模擬這塊,revit提供了自適應公制常規模型,能夠非常靈活地去近似模擬復雜的曲線和曲面。針對存在平豎曲線的粱段,可以通過以下步驟來模擬:
如果橋梁截面為箱梁截面,外輪廓生成實體,內輪廓生成剪切體,就能得到粱段的箱梁實體。
代碼實現
下面將為大家展示一個粱段生成的代碼
using System; using System.Collections.Generic; using System.Linq; using Autodesk.Revit.UI; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Structure;namespace ToolSet.Command {[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]class Bridge : ToolSetCommandBase{public override Result RunImpl(ExternalCommandData commandData, ref string message, ElementSet elements){var uiApp = commandData.Application;#region 數據準備var pointStart = new XYZ(0, 0, 0);var dirStart = new XYZ(1, 0.1, 0).Normalize();var pointEnd = new XYZ(10, 0.5, 0.5);var dirEnd = new XYZ(1, 0.2, 0).Normalize();var pointsOuterStart = new List<XYZ>(){new XYZ(0,0,0.1),new XYZ(0,5,0),new XYZ(0,5,-0.2),new XYZ(0,3,-0.2),new XYZ(0,3,-3),new XYZ(0,-3,-3),new XYZ(0,-3,-0.2),new XYZ(0,-5,-0.2),new XYZ(0,-5,0)};var pointsOuterEnd = new List<XYZ>(){new XYZ(0,0,0.1),new XYZ(0,5,0),new XYZ(0,5,-0.2),new XYZ(0,3,-0.2),new XYZ(0,3,-3.2),new XYZ(0,-3,-3.2),new XYZ(0,-3,-0.2),new XYZ(0,-5,-0.2),new XYZ(0,-5,0)};var pointsInnerStart = new List<XYZ>(){new XYZ(0,2.7,-0.2),new XYZ(0,2.7,-2.8),new XYZ(0,-2.7,-2.8),new XYZ(0,-2.7,-0.2)};var pointsInnerEnd = new List<XYZ>(){new XYZ(0,2.7,-0.2),new XYZ(0,2.7,-3.0),new XYZ(0,-2.7,-3.0),new XYZ(0,-2.7,-0.2)};var sectionStart = new Section(pointStart, dirStart, pointsInnerStart, pointsOuterStart);var sectionEnd = new Section(pointEnd, dirEnd, pointsInnerEnd, pointsOuterEnd);#endregionCreateBoxGirder(uiApp, sectionStart, sectionEnd);//創建箱梁return Result.Succeeded;}/// <summary>/// 創建箱梁/// </summary>/// <param name="uiApp"></param>/// <param name="sectionStart"></param>/// <param name="sectionEnd"></param>private void CreateBoxGirder(UIApplication uiApp, Section sectionStart, Section sectionEnd){var doc = uiApp.ActiveUIDocument.Document;var pointsInnerStart = sectionStart.PointsInner;var pointsOuterStart = sectionStart.PointsOuter;var pointsInnerEnd = sectionEnd.PointsInner;var pointsOuterEnd = sectionEnd.PointsOuter;var pointStart = sectionStart.Location;var dirStart = sectionStart.Direction;var pointEnd = sectionEnd.Location;var dirEnd = sectionEnd.Direction;pointsInnerStart = MoveAndRotate(pointsInnerStart, pointsOuterStart[0], XYZ.BasisX, pointStart, dirStart);pointsInnerStart.Reverse();pointsOuterStart = MoveAndRotate(pointsOuterStart, pointsOuterStart[0], XYZ.BasisX, pointStart, dirStart);pointsInnerEnd = MoveAndRotate(pointsInnerEnd, pointsOuterEnd[0], XYZ.BasisX, pointEnd, dirEnd);pointsInnerEnd.Reverse();pointsOuterEnd = MoveAndRotate(pointsOuterEnd, pointsOuterEnd[0], XYZ.BasisX, pointEnd, dirEnd);var lineOuterStart = pointsOuterStart.Select((t, i) => Line.CreateBound(t, pointsOuterStart[(i + 1) % pointsOuterStart.Count])).ToList();var lineInnerStart = pointsInnerStart.Select((t, i) => Line.CreateBound(t, pointsInnerStart[(i + 1) % pointsInnerStart.Count])).ToList();var lineOuterEnd = pointsOuterEnd.Select((t, i) => Line.CreateBound(t, pointsOuterEnd[(i + 1) % pointsOuterEnd.Count])).ToList();var lineInnerEnd = pointsInnerEnd.Select((t, i) => Line.CreateBound(t, pointsInnerEnd[(i + 1) % pointsInnerEnd.Count])).ToList();const string path = @"F:\自適應公制常規模型.rft";var familyDoc = uiApp.Application.NewFamilyDocument(path);var transaction1 = new Transaction(familyDoc);transaction1.Start("CreateFamily");var plane1 = Plane.CreateByNormalAndOrigin(dirStart, pointStart);var plane2 = Plane.CreateByNormalAndOrigin(dirEnd, pointEnd);var sketchPlaneStart = SketchPlane.Create(familyDoc, plane1);var sketchPlaneEnd = SketchPlane.Create(familyDoc, plane2);var profiles0 = new ReferenceArray();var profiles1 = new ReferenceArray();lineOuterStart.ForEach(x => profiles0.Append(familyDoc.FamilyCreate.NewModelCurve(x, sketchPlaneStart).GeometryCurve.Reference));lineOuterEnd.ForEach(x => profiles1.Append(familyDoc.FamilyCreate.NewModelCurve(x, sketchPlaneEnd).GeometryCurve.Reference));var profilesArray = new ReferenceArrayArray();profilesArray.Append(profiles0);profilesArray.Append(profiles1);familyDoc.FamilyCreate.NewLoftForm(true, profilesArray);profiles0 = new ReferenceArray();profiles1 = new ReferenceArray();lineInnerStart.ForEach(x => profiles0.Append(familyDoc.FamilyCreate.NewModelCurve(x, sketchPlaneStart).GeometryCurve.Reference));lineInnerEnd.ForEach(x => profiles1.Append(familyDoc.FamilyCreate.NewModelCurve(x, sketchPlaneEnd).GeometryCurve.Reference));profilesArray = new ReferenceArrayArray();profilesArray.Append(profiles0);profilesArray.Append(profiles1);familyDoc.FamilyCreate.NewLoftForm(false, profilesArray);transaction1.Commit();var loadedFamily = familyDoc.LoadFamily(doc, new MyFamilyLoadOptions());familyDoc.Close(false);var trans = new Transaction(doc, "CreateBoxGirder");trans.Start();if (doc.GetElement(loadedFamily.GetFamilySymbolIds().First()) is FamilySymbol familySymbol){familySymbol.Activate();doc.Create.NewFamilyInstance(new XYZ(0, 0, 0), familySymbol, StructuralType.NonStructural);}trans.Commit();}/// <summary>/// 將YOZ平面內的截面點位移動并旋轉到實際截面位置/// </summary>/// <param name="pointInputs"></param>/// <param name="originInput"></param>/// <param name="normalInput"></param>/// <param name="originTarget"></param>/// <param name="normalTarget"></param>/// <returns></returns>private List<XYZ> MoveAndRotate(List<XYZ> pointInputs, XYZ originInput, XYZ normalInput, XYZ originTarget, XYZ normalTarget){var pointOutputs = new List<XYZ>();foreach (var pointInput in pointInputs){var pointOutput = pointInput + originTarget - originInput;var angle = -normalTarget.AngleOnPlaneTo(normalInput, XYZ.BasisZ);var xyz1 = pointOutput - originTarget;xyz1 = xyz1 - XYZ.BasisZ * xyz1.Z;var xyz2 = xyz1.GetLength() * XYZ.BasisZ.CrossProduct(xyz1).Normalize();var pointTemp = originTarget + xyz1 * Math.Cos(angle) + xyz2 * Math.Sin(angle);pointOutput = pointTemp + XYZ.BasisZ * (-pointTemp.Z + pointOutput.Z);pointOutputs.Add(pointOutput);}return pointOutputs;}/// <summary>/// 截面類/// </summary>private class Section{public XYZ Location { get; set; }//截面位置public XYZ Direction { get; set; }//前進方向public List<XYZ> PointsInner { get; set; }//內輪廓public List<XYZ> PointsOuter { get; set; }//外輪廓public Section(XYZ location, XYZ direction, List<XYZ> pointsInner, List<XYZ> pointsOuter){Location = location;Direction = direction;PointsInner = pointsInner;PointsOuter = pointsOuter;}}} }運行效果
運行前將“自適應公制常規模型.rft”放到代碼中指定位置,或者修改相關路徑,然后運行。運行效果下圖示:
著色后效果如下圖2所示:
總結
以上是生活随笔為你收集整理的revit开发__箱梁粱体生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人免签支付
- 下一篇: 11种物联网协议简介,如WiFi、蓝牙、