158 lines
6.9 KiB
C#
158 lines
6.9 KiB
C#
|
|
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<CDMBeam> GetBeamsCDM(Document doc, IList<Element> levels)
|
|||
|
|
{
|
|||
|
|
List<CDMBeam> cdmBeams = new List<CDMBeam>();
|
|||
|
|
var beams = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralFraming).OfClass(typeof(FamilyInstance)).ToElements();
|
|||
|
|
//得到标高+编码
|
|||
|
|
Dictionary<ElementId, string> dictLevelId_LevelCodes = GetDictLevelId_LevelCodes(doc);
|
|||
|
|
//梁类型与编码
|
|||
|
|
Dictionary<ElementId, string> dicBeams = new Dictionary<ElementId, string>();
|
|||
|
|
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<CDMBeam> targetcdm = from b in cdmBeams
|
|||
|
|
where b.LevelId.Equals(levels[i].Id) && b.SymbolId.Equals(id)
|
|||
|
|
select b;
|
|||
|
|
List<CDMBeam> CdmBeamsordered = targetcdm.OrderByDescending(p => p.Yw).ThenBy(p => p.Xl).ToList();
|
|||
|
|
//排序
|
|||
|
|
//var li = targetcdm.ToList();
|
|||
|
|
//List<CDMBeam> 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<RevitBeam> 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();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|