日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

revit开发__箱梁粱体生成

發布時間:2024/3/26 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 revit开发__箱梁粱体生成 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

revit開發__箱梁粱體生成

    • 問題描述
    • 解決思路
    • 代碼實現
    • 運行效果

問題描述

對于梁式橋,因為平豎曲線的存在,無法簡單地用拉伸去模擬橋梁的形狀。如果強行用拉伸去生成,粱段與粱段之間會出現缺口,中心線也變成一段段折線,效果不理想。

解決思路

在曲線和曲面模擬這塊,revit提供了自適應公制常規模型,能夠非常靈活地去近似模擬復雜的曲線和曲面。針對存在平豎曲線的粱段,可以通過以下步驟來模擬:

  • 新建族,族樣板文件選擇自適應公制常規模型;
  • 計算粱段起點、終點的幾何位置和前進方向;
  • 生成粱段的前后端截面內外輪廓;
  • 外輪廓生成實體,內輪廓生成剪切體,并添加其他必要的族參數;
  • 族文件載入模型,并在相應位置創建實例;
  • 重復1~5過程,生成全部的粱段。
  • 如果橋梁截面為箱梁截面,外輪廓生成實體,內輪廓生成剪切體,就能得到粱段的箱梁實體。

    代碼實現

    下面將為大家展示一個粱段生成的代碼

    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开发__箱梁粱体生成的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。