141 lines
6.5 KiB
C#
141 lines
6.5 KiB
C#
|
|
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();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|