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 ColumnUtil : Utility { public static List GetColumnCDM(Document doc, IList levels) { List cdmColumns = new List(); var columns = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralColumns).OfClass(typeof(FamilyInstance)).ToElements(); //得到标高+编码 Dictionary dictLevelId_LevelCodes = GetDictLevelId_LevelCodes(doc); //柱子类型ID+赋予序号 Dictionary dictColumnTypeId_TypeCodes = new Dictionary(); int num = 1; for (int i = 0; i < columns.Count; i++) { ElementId columntypeId = columns[i].GetTypeId(); try { dictColumnTypeId_TypeCodes.Add(columntypeId, string.Format("00{0}", num)); num += 1; } catch (Exception) { continue; } } foreach (FamilyInstance column in columns) { //View3D v = (View3D)uidoc.ActiveView; //if (v == null) //{ // var vi = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Views).OfClass(typeof(View3D)).FirstOrDefault() as View3D; // uidoc.ActiveView = vi; //} CDMColumn cdmcolumn = new CDMColumn(column); ////通过out,将获取到的值复制给cdm的类型id,out参数必须在函数内初始化值 dictColumnTypeId_TypeCodes.TryGetValue(cdmcolumn.SymbolId, out cdmcolumn.CategoryCode); dictLevelId_LevelCodes.TryGetValue(cdmcolumn.LevelId, out cdmcolumn.LevelCode); cdmColumns.Add(cdmcolumn); } for (int i = 0; i < levels.Count(); i++) { for (int j = 0; j < dictColumnTypeId_TypeCodes.Count; j++) { ElementId id = dictColumnTypeId_TypeCodes.ElementAt(j).Key; //归类cdm中同标高同类型 IEnumerable targetcdm = from c in cdmColumns where c.LevelId.Equals(levels[i].Id) && c.SymbolId.Equals(id) select c; List CdmColumnsordered = targetcdm.OrderByDescending(p => p.Yw).ThenBy(p => p.Xl).ToList(); //排序 for (int k = 0; k < CdmColumnsordered.Count; k++) { if (k > 8) { if (k > 98) { CdmColumnsordered[k].LevelComponentCode = string.Format("{0}", k + 1); } else { CdmColumnsordered[k].LevelComponentCode = string.Format("0{0}", k + 1); } } else { CdmColumnsordered[k].LevelComponentCode = string.Format("00{0}", k + 1); } } } } return cdmColumns; } public static void PlaceColumns(Document doc, Family family, List columns, Level level) { using (Transaction trans = new Transaction(doc, "布置柱")) { trans.Start(); //用于复制创建新类型 FamilySymbol defaultfamilysymbol = doc.GetElement(family.GetFamilySymbolIds().FirstOrDefault()) as FamilySymbol; FamilySymbol targetColumnSymbol = null; foreach (var column in columns) { //var targetSymbolName = column.Name.Substring(column.Name.IndexOf('@') + 1); var targetSymbolName = column.SectionB + "x" + column.SectionH + " mm"; var symbolIds = family.GetFamilySymbolIds(); var symbols = from symbolid in symbolIds where doc.GetElement(symbolid).Name == targetSymbolName select doc.GetElement(symbolid) as FamilySymbol; //不存在则创建并布置,存在则激活布置 if (symbols.Count() == 0) { targetColumnSymbol = defaultfamilysymbol.Duplicate(targetSymbolName) as FamilySymbol; targetColumnSymbol.GetParameters("b").FirstOrDefault().SetValueString(column.SectionB.ToString()); targetColumnSymbol.GetParameters("h").FirstOrDefault().SetValueString(column.SectionH.ToString()); } else { targetColumnSymbol = symbols.FirstOrDefault(); } if (!targetColumnSymbol.IsActive) targetColumnSymbol.Activate();//设为Activate状态 FamilyInstance fi = doc.Create.NewFamilyInstance(column.rOrigin, targetColumnSymbol, level, Autodesk.Revit.DB.Structure.StructuralType.Column); //Parameter p = fi.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_PARAM); //Parameter p1 = fi.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_PARAM); //Parameter p2 = fi.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM); //Parameter p3 = fi.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM); fi.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_PARAM).Set(level.Id); fi.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_PARAM).Set(level.Id); fi.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM).Set(column.BaseOffest / 304.8); fi.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM).Set(column.TopOffest / 304.8); } trans.Commit(); } } } }