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; namespace CDM.Interop.Revit.Utility { class FloorUtil : Utility { public static List GetFloorsCDM(Document doc, IList levels, View3D v3d) { List cdmFloors = new List(); var floors = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors).OfClass(typeof(Floor)).ToElements(); //楼板类型及编号 Dictionary dicFloors = new Dictionary(); Dictionary dictLevelId_LevelCodes = GetDictLevelId_LevelCodes(doc); int num = 1; for (int i = 0; i < floors.Count; i++) { ElementId floortypeId = floors[i].GetTypeId(); try { dicFloors.Add(floortypeId, string.Format("00{0}", num)); num += 1; } catch (Exception) { continue; } } foreach (Floor floor in floors) { CDMFloor cdmfloor = new CDMFloor(doc, floor, v3d); ////通过out,将获取到的值复制给cdm的类型id,out参数必须在函数内初始化值 dicFloors.TryGetValue(floor.FloorType.Id, out cdmfloor.CategoryCode); dictLevelId_LevelCodes.TryGetValue(cdmfloor.LevelId, out cdmfloor.LevelCode); cdmFloors.Add(cdmfloor); } for (int i = 0; i < levels.Count(); i++) { for (int j = 0; j < dicFloors.Count; j++) { ElementId id = dicFloors.ElementAt(j).Key; //归类cdm中同标高同类型 IEnumerable targetcdm = from d in cdmFloors where d.LevelId.Equals(levels[i].Id) && d.SymbolId.Equals(id) select d; //排序 //var li = targetcdm.ToList(); List li = targetcdm.OrderByDescending(p => p.Yw).ThenBy(p => p.Xl).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 cdmFloors; } private static CurveArray SetBoundary(XYZ rOrigin, double length, double width) { XYZ p1 = new XYZ(rOrigin.X, rOrigin.Y - width / 2, 0); XYZ p2 = new XYZ(rOrigin.X, rOrigin.Y + width / 2, 0); XYZ p3 = new XYZ(rOrigin.X + length, rOrigin.Y + width / 2, 0); XYZ p4 = new XYZ(rOrigin.X + length, rOrigin.Y - width / 2, 0); Autodesk.Revit.DB.Line line1 = Autodesk.Revit.DB.Line.CreateBound(p1, p2); Autodesk.Revit.DB.Line line2 = Autodesk.Revit.DB.Line.CreateBound(p2, p3); Autodesk.Revit.DB.Line line3 = Autodesk.Revit.DB.Line.CreateBound(p3, p4); Autodesk.Revit.DB.Line line4 = Autodesk.Revit.DB.Line.CreateBound(p4, p1); CurveArray lines = new CurveArray(); lines.Append(line1); lines.Append(line2); lines.Append(line3); lines.Append(line4); return lines; } public static void PlaceFloors(Document doc, List rfloors, Level level) { if (rfloors == null || level == null) { return; } var fts = new FilteredElementCollector(doc).OfClass(typeof(FloorType)); FloorType defft = new FilteredElementCollector(doc).OfClass(typeof(FloorType)).FirstOrDefault() as FloorType; var floorTypesCol = new FilteredElementCollector(doc).OfClass(typeof(FloorType)); FloorType targetFloorType = null; using (Transaction trans = new Transaction(doc, "布置板")) { trans.Start(); foreach (RevitFloor rfloor in rfloors) { Floor fl = null; //var targetFloorName = rfloor.Name.Substring(rfloor.Name.IndexOf('@') + 1); var targetFloorName = rfloor.Thickness + "mm"; var floorTypes = from f in floorTypesCol where f.Name == targetFloorName select f as FloorType; if (floorTypes.Count() == 0) { targetFloorType = defft.Duplicate(targetFloorName) as FloorType; CompoundStructure compound = targetFloorType.GetCompoundStructure(); compound.SetLayerWidth(0, rfloor.Thickness / 304.8); targetFloorType.SetCompoundStructure(compound); } else { targetFloorType = floorTypes.FirstOrDefault(); } var arr = SetBoundary(rfloor.rOrigin, rfloor.Length / 304.8, rfloor.Width / 304.8); fl = doc.Create.NewFloor(arr, targetFloorType, level, true); fl.get_Parameter(BuiltInParameter.FLOOR_HEIGHTABOVELEVEL_PARAM).Set(rfloor.Offest / 304.8); doc.Regenerate();//设置完偏移量参数刷新 CreateOpenings(doc, fl, rfloor.Openings); } trans.Commit(); } } public static void CreateOpenings(Document doc, Floor floor, List ropenings) { foreach (var opening in ropenings) { try { XYZ p1 = new XYZ(opening.rOrigin.X, opening.rOrigin.Y - opening.Width / 304.8 / 2, opening.rOrigin.Z); XYZ p2 = new XYZ(opening.rOrigin.X, opening.rOrigin.Y + opening.Width / 304.8 / 2, opening.rOrigin.Z); XYZ p3 = new XYZ(opening.rOrigin.X + opening.Length / 304.8, opening.rOrigin.Y + opening.Width / 304.8 / 2, opening.rOrigin.Z); XYZ p4 = new XYZ(opening.rOrigin.X + opening.Length / 304.8, opening.rOrigin.Y - opening.Width / 304.8 / 2, opening.rOrigin.Z); CurveArray curves = new CurveArray(); Line l1 = Line.CreateBound(p1, p2); Line l2 = Line.CreateBound(p2, p3); Line l3 = Line.CreateBound(p3, p4); Line l4 = Line.CreateBound(p4, p1); curves.Append(l1); curves.Append(l2); curves.Append(l3); curves.Append(l4); doc.Create.NewOpening(floor, curves, true); } catch (Exception) { continue; } } } } }