using Autodesk.Revit.DB; using Autodesk.Revit.DB.Architecture; using CDM.Interop.Revit.RevitCompoent; using OfficeOpenXml; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CDM.Interop.Revit.RevitCompoent { class RevitStairs : RevitComponent { public RevitStairs(string path) { using (ExcelPackage package = new ExcelPackage(new FileStream(path, FileMode.Open))) { ExcelWorksheet sheet = package.Workbook.Worksheets[1]; //ExcelWorksheet sheet = package.Workbook.Worksheets["基本构件"]; this.Name = sheet.Cells["G2"].Value.ToString(); this.Comment = sheet.Cells["G4"].Value.ToString(); Runs = new List(); var run1 = new RevitStairsRun() { Xl = Convert.ToDouble(sheet.Cells["H14"].Value), Yw = Convert.ToDouble(sheet.Cells["H15"].Value), Zh = Convert.ToDouble(sheet.Cells["H16"].Value), DegreesWithXAxis = Convert.ToDouble(sheet.Cells["H17"].Value), Length = Convert.ToDouble(sheet.Cells["H18"].Value), Width = Convert.ToDouble(sheet.Cells["H19"].Value), Height = Convert.ToDouble(sheet.Cells["H20"].Value), Thickness = Convert.ToDouble(sheet.Cells["H21"].Value), NumberOfRisers = Convert.ToInt32(sheet.Cells["H22"].Value) }; var run2 = new RevitStairsRun() { Xl = Convert.ToDouble(sheet.Cells["H29"].Value), Yw = Convert.ToDouble(sheet.Cells["H30"].Value), Zh = Convert.ToDouble(sheet.Cells["H31"].Value), DegreesWithXAxis = Convert.ToDouble(sheet.Cells["H32"].Value), Length = Convert.ToDouble(sheet.Cells["H33"].Value), Width = Convert.ToDouble(sheet.Cells["H34"].Value), Height = Convert.ToDouble(sheet.Cells["H35"].Value), Thickness = Convert.ToDouble(sheet.Cells["H36"].Value), NumberOfRisers = Convert.ToInt32(sheet.Cells["H37"].Value), }; Runs.Add(run1); Runs.Add(run2); ThreadDepth = run1.Length / (run1.NumberOfRisers - 1) / 304.8; Landing = new RevitStairsLanding() { Xl = Convert.ToDouble(sheet.Cells["H23"].Value), Yw = Convert.ToDouble(sheet.Cells["H24"].Value), Zh = Convert.ToDouble(sheet.Cells["H25"].Value), Length = Convert.ToDouble(sheet.Cells["H26"].Value), Width = Convert.ToDouble(sheet.Cells["H27"].Value), Thickness = Convert.ToDouble(sheet.Cells["H28"].Value), }; if (run1.Zh < run2.Zh) { Landing.RelativeElevation = run1.Height; run1.RelativeBaseElevation = 0; run1.RelativeTopELevation = run1.Height; run2.RelativeBaseElevation = Landing.RelativeElevation; run2.RelativeTopELevation = Landing.RelativeElevation + run2.Height; } else { Landing.RelativeElevation = run2.Height; run2.RelativeBaseElevation = 0; run2.RelativeTopELevation = run2.Height; run1.RelativeBaseElevation = Landing.RelativeElevation; run1.RelativeTopELevation = Landing.RelativeElevation + run1.Height; } TopElevation = getTopElevation(run1, run2); BaseElevation = getBaseElevationn(run1, run2); } } public List Runs; public RevitStairsLanding Landing; public double TopElevation; public double BaseElevation; public int GetNumberOfRisers(List runs) { int num = 0; foreach (var run in runs) { num += run.NumberOfRisers; } return num; } /// /// 顶部偏移 /// private double getTopElevation(RevitStairsRun run1, RevitStairsRun run2) { if (run1.Zh > run2.Zh) { return (run1.Zh * 1000 + run1.Height) / 304.8; } else { return (run2.Zh * 1000 + run2.Height) / 304.8; } } /// /// 底部偏移 /// private double getBaseElevationn(RevitStairsRun run1, RevitStairsRun run2) { if (run1.Zh > run2.Zh) { return run2.Zh * 1000 / 304.8; } else { return run1.Zh * 1000 / 304.8; } } public double ThreadDepth { get; private set; } } class RevitStairsRun : RevitComponent { /// /// Revit中的定位点 /// public XYZ rOrigin => new XYZ(Xl, Yw, RelativeBaseElevation / 1000) * 1000 / 304.8; public double Radians => Math.PI / 180 * DegreesWithXAxis; public XYZ rDirection => new XYZ(Math.Cos(Radians), Math.Sin(Radians), 0); public XYZ rEndPoint => rOrigin + rDirection * Length / 304.8; /// /// 踢面数 /// public int NumberOfRisers { get; set; } /// /// 梯段宽度 /// public double Width { get; set; } /// /// 梯段长度 /// public double Length { get; set; } /// /// 楼梯高度 /// public double Height { get; set; } /// /// 梯段厚度 /// public double Thickness { get; set; } public Line LocationLine => Line.CreateBound(rOrigin, rEndPoint); public double RelativeBaseElevation { get; set; } public double RelativeTopELevation { get; set; } } class RevitStairsLanding : RevitComponent { /// /// 平台板厚度 /// public double Thickness { get; set; } /// /// 平台板长度 /// public double Length { get; set; } /// /// 平台板宽度 /// public double Width { get; set; } /// /// 相对基准平台高程 /// public double RelativeElevation { get; set; } public CurveLoop GetCurves() { CurveLoop landingLoop = new CurveLoop(); XYZ p1 = new XYZ(Xl * 1000, Yw * 1000 - Width / 2, 0) / 304.8; XYZ p2 = new XYZ(Xl * 1000, Yw * 1000 + Width / 2, 0) / 304.8; XYZ p3 = new XYZ(Xl * 1000 + Length, Yw * 1000 + Width / 2, 0) / 304.8; XYZ p4 = new XYZ(Xl * 1000 + Length, Yw * 1000 - Width / 2, 0) / 304.8; Line curve_1 = Line.CreateBound(p1, p2); Line curve_2 = Line.CreateBound(p2, p3); Line curve_3 = Line.CreateBound(p3, p4); Line curve_4 = Line.CreateBound(p4, p1); landingLoop.Append(curve_1); landingLoop.Append(curve_2); landingLoop.Append(curve_3); landingLoop.Append(curve_4); return landingLoop; } } }