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

158 lines
6.9 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.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();
}
}
}
}