using Autodesk.Revit.DB; using Autodesk.Revit.DB.Structure; 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 BeamUtil : Utility { public static List GetBeamsCDM(Document doc, IList levels) { List cdmBeams = new List(); var beams = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralFraming).OfClass(typeof(FamilyInstance)).ToElements(); //得到标高+编码 Dictionary dictLevelId_LevelCodes = GetDictLevelId_LevelCodes(doc); //梁类型与编码 Dictionary dicBeams = new Dictionary(); int num = 1; for (int i = 0; i < beams.Count; i++) { ElementId beamtypeId = beams[i].GetTypeId(); try { if (num > 9 && num <= 99) { dicBeams.Add(beamtypeId, string.Format("0{0}", num)); } else if (num > 99) { dicBeams.Add(beamtypeId, string.Format("{0}", num)); } else { dicBeams.Add(beamtypeId, string.Format("00{0}", num)); } num += 1; } catch (Exception) { continue; } } foreach (FamilyInstance beam in beams) { //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 s = ((LocationCurve)beam.Location).Curve.GetEndPoint(0); XYZ e = ((LocationCurve)beam.Location).Curve.GetEndPoint(1); //XYZ s = beam.GetSweptProfile().GetDrivingCurve().GetEndPoint(0); //XYZ e = beam.GetSweptProfile().GetDrivingCurve().GetEndPoint(1); if (beam.HasSweptProfile() == true) { CDMBeam cdmbeam = new CDMBeam(beam); //通过out,将获取到的值复制给cdm的类型id,out参数必须在函数内初始化值 dicBeams.TryGetValue(cdmbeam.SymbolId, out cdmbeam.CategoryCode); dictLevelId_LevelCodes.TryGetValue(cdmbeam.LevelId, out cdmbeam.LevelCode); cdmBeams.Add(cdmbeam); } } for (int i = 0; i < levels.Count(); i++) { for (int j = 0; j < dicBeams.Count; j++) { ElementId id = dicBeams.ElementAt(j).Key; //归类cdm中同标高同类型 IEnumerable targetcdm = from b in cdmBeams where b.LevelId.Equals(levels[i].Id) && b.SymbolId.Equals(id) select b; List CdmBeamsordered = targetcdm.OrderByDescending(p => p.Yw).ThenBy(p => p.Xl).ToList(); //排序 //var li = targetcdm.ToList(); //List li = targetcdm.OrderByDescending(p => p.BasePoint.Y).ThenBy(p => p.BasePoint.X).ToList(); for (int k = 0; k < CdmBeamsordered.Count; k++) { if (k > 8) { if (k > 98) { CdmBeamsordered[k].LevelComponentCode = string.Format("{0}", k + 1); } else { CdmBeamsordered[k].LevelComponentCode = string.Format("0{0}", k + 1); } } else { CdmBeamsordered[k].LevelComponentCode = string.Format("00{0}", k + 1); } } } } return cdmBeams; } public static void PlaceBeams(Document doc, Family family, List rbeams, Level level) { if (rbeams == null || level == null) { return; } FamilySymbol defaultfamilysymbol = doc.GetElement(family.GetFamilySymbolIds().FirstOrDefault()) as FamilySymbol; FamilySymbol targetBeamSymbol = null; using (Transaction trans = new Transaction(doc)) { trans.Start("布置梁"); foreach (var beam in rbeams) { //var targetSymbolName = beam.Name.Substring(beam.Name.IndexOf('@') + 1); var targetSymbolName = beam.SectionB + " x " + beam.SectionH + "mm"; var symbolIds = family.GetFamilySymbolIds(); var symbols = from symbolid in symbolIds where doc.GetElement(symbolid).Name == targetSymbolName select doc.GetElement(symbolid) as FamilySymbol; //string symbolname = String.Format("{0}{1}{2}mm", beam.SectionB, "x", beam.SectionH); if (symbols.Count() == 0) { targetBeamSymbol = defaultfamilysymbol.Duplicate(targetSymbolName) as FamilySymbol; targetBeamSymbol.GetParameters("b").FirstOrDefault().SetValueString(beam.SectionB.ToString()); targetBeamSymbol.GetParameters("h").FirstOrDefault().SetValueString(beam.SectionH.ToString()); } else { targetBeamSymbol = symbols.FirstOrDefault(); } Autodesk.Revit.DB.Line line = Autodesk.Revit.DB.Line.CreateBound(beam.rOrigin, beam.rEndPoint); if (!targetBeamSymbol.IsActive) targetBeamSymbol.Activate(); FamilyInstance fi = doc.Create.NewFamilyInstance(line, targetBeamSymbol, level, StructuralType.Beam); //原点=2,左=0,中心=1,右=3 fi.get_Parameter(BuiltInParameter.Y_JUSTIFICATION).Set(2); fi.get_Parameter(BuiltInParameter.Z_JUSTIFICATION).Set(2); } trans.Commit(); } } } }