using Autodesk.Revit.DB; using Autodesk.Revit.UI; using CDM.Interop.Revit.CDMComponent; using CDM.Interop.Revit.RevitCompoent; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CDM.Interop.Revit.Utility { class WallUtil : Utility { public static List GetWallsCDM(UIDocument uidoc, IList levels) { List cdmWalls = new List(); Document doc = uidoc.Document; var walls = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).OfClass(typeof(Wall)).ToElements(); //楼板类型及编号 Dictionary dicWalls = new Dictionary(); int num1 = 1; for (int i = 0; i < walls.Count; i++) { ElementId flId = walls[i].GetTypeId(); try { dicWalls.Add(flId, string.Format("0{0}", num1)); num1 += 1; } catch (Exception) { continue; } } foreach (Wall wall in walls) { View3D v = (View3D)uidoc.ActiveView; if (v == null) { var vi = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Views).OfClass(typeof(View3D)).ToElements(); uidoc.ActiveView = (View3D)vi.FirstOrDefault(); } //XYZ p = beam.GetTransform().Origin; XYZ s = ((LocationCurve)wall.Location).Curve.GetEndPoint(0); XYZ e = ((LocationCurve)wall.Location).Curve.GetEndPoint(1); Level level = (Level)doc.GetElement(wall.get_Parameter(BuiltInParameter.WALL_BASE_CONSTRAINT).AsElementId()); CDMWall cdmwall = new CDMWall { self = wall, //AbsLevel= floor.get_Parameter(BuiltInParameter.STRUCTURAL_ELEVATION_AT_TOP).AsValueString() BaseLevel = (Level)doc.GetElement(wall.get_Parameter(BuiltInParameter.WALL_BASE_CONSTRAINT).AsElementId()), LevelCode = doc.GetElement(wall.LevelId).Name, SymbolId = wall.GetTypeId(), //CDMTypeId = HcdmType.CDMWall, Thickness = wall.WallType.get_Parameter(BuiltInParameter.WALL_ATTR_WIDTH_PARAM).AsValueString(), //Thickness=wall.Width.ToString(), BasePoint = s, ExtendPoint = e }; ////通过out,将获取到的值复制给cdm的类型id,out参数必须在函数内初始化值 dicWalls.TryGetValue(cdmwall.SymbolId, out cdmwall.CategoryCode); cdmWalls.Add(cdmwall); } for (int i = 0; i < levels.Count(); i++) { for (int j = 0; j < dicWalls.Count; j++) { ElementId id = dicWalls.ElementAt(j).Key; //归类cdm中同标高同类型 IEnumerable targetcdm = from b in cdmWalls where b.BaseLevel.Id.Equals(levels[i].Id) && b.SymbolId.Equals(id) select b; List li = targetcdm.OrderByDescending(p => p.BasePoint.Y).ThenBy(p => p.BasePoint.X).ToList(); //排序 //var li = targetcdm.ToList(); //List li = targetcdm.OrderByDescending(p => p.BasePoint.Y).ThenBy(p => p.BasePoint.X).ToList(); for (int k = 0; k < li.Count; k++) { if (k > 8) { if (k > 98) { li[k].LevelComponentCode = string.Format("{0}", k + 1); } else { li[k].LevelComponentCode = string.Format("0{0}", k + 1); } } else { li[k].LevelComponentCode = string.Format("00{0}", k + 1); } } } } return cdmWalls; } public static void PlaceWalls(Document doc, List rwalls, Level level) { if (rwalls == null || level == null) { return; } var wallTypes = new FilteredElementCollector(doc).OfClass(typeof(WallType)).ToElements(); using (Transaction trans = new Transaction(doc)) { trans.Start("创建墙"); foreach (var wall in rwalls) { foreach (WallType t in wallTypes) { if (t.Kind == WallKind.Basic) { string x = t.get_Parameter(BuiltInParameter.WALL_ATTR_WIDTH_PARAM).AsValueString(); if (x == wall.Thickness) { //var l = wall.BasePoint - wall.ExtendPoint; Autodesk.Revit.DB.Line line = Autodesk.Revit.DB.Line.CreateBound(wall.BasePoint, wall.ExtendPoint); var levelelev = level.get_Parameter(BuiltInParameter.LEVEL_ELEV).AsValueString(); Wall.Create(doc, line, t.Id, level.Id, wall.Height / 304.8, (Convert.ToDouble(wall.StrBaseElev) - Convert.ToDouble(levelelev)) / 304.8, false, false); //Wall.Create(doc, line, t.Id, level.Id, wall.Height / 304.8, Convert.ToDouble(wall.StrTopElev) / 304.8, false, false); break; } } } } trans.Commit(); } } } }