Files
CDMUtility/CDMUtil/Utility/ColumnUtil.cs
2026-02-23 14:35:54 +08:00

141 lines
6.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<CDMColumn> GetColumnCDM(Document doc, IList<Element> levels)
{
List<CDMColumn> cdmColumns = new List<CDMColumn>();
var columns = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralColumns).OfClass(typeof(FamilyInstance)).ToElements();
//得到标高+编码
Dictionary<ElementId, string> dictLevelId_LevelCodes = GetDictLevelId_LevelCodes(doc);
//柱子类型ID+赋予序号
Dictionary<ElementId, string> dictColumnTypeId_TypeCodes = new Dictionary<ElementId, string>();
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<CDMColumn> targetcdm = from c in cdmColumns
where c.LevelId.Equals(levels[i].Id) && c.SymbolId.Equals(id)
select c;
List<CDMColumn> 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<RevitColumn> 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();
}
}
}
}