Files
CDMUtility/CDMUtil/Utility/WallUtil.cs

144 lines
6.1 KiB
C#
Raw Normal View History

2026-02-23 14:35:54 +08:00
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 WallUtil : Utility
{
public static List<CDMWall> GetWallsCDM(UIDocument uidoc, IList<Element> levels)
{
List<CDMWall> cdmWalls = new List<CDMWall>();
Document doc = uidoc.Document;
var walls = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).OfClass(typeof(Wall)).ToElements();
//楼板类型及编号
Dictionary<ElementId, string> dicWalls = new Dictionary<ElementId, string>();
int num1 = 1;
for (int i = 0; i < walls.Count; i++)
{
ElementId flId = walls[i].GetTypeId();
try
{
dicWalls.Add(flId, string.Format("0{0}", num1));
num1 += 1;
}
catch (Exception)
{
continue;
}
}
foreach (Wall wall in walls)
{
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 p = beam.GetTransform().Origin;
XYZ s = ((LocationCurve)wall.Location).Curve.GetEndPoint(0);
XYZ e = ((LocationCurve)wall.Location).Curve.GetEndPoint(1);
Level level = (Level)doc.GetElement(wall.get_Parameter(BuiltInParameter.WALL_BASE_CONSTRAINT).AsElementId());
CDMWall cdmwall = new CDMWall
{
self = wall,
//AbsLevel= floor.get_Parameter(BuiltInParameter.STRUCTURAL_ELEVATION_AT_TOP).AsValueString()
BaseLevel = (Level)doc.GetElement(wall.get_Parameter(BuiltInParameter.WALL_BASE_CONSTRAINT).AsElementId()),
LevelCode = doc.GetElement(wall.LevelId).Name,
SymbolId = wall.GetTypeId(),
//CDMTypeId = HcdmType.CDMWall,
Thickness = wall.WallType.get_Parameter(BuiltInParameter.WALL_ATTR_WIDTH_PARAM).AsValueString(),
//Thickness=wall.Width.ToString(),
BasePoint = s,
ExtendPoint = e
};
////通过out将获取到的值复制给cdm的类型id,out参数必须在函数内初始化值
dicWalls.TryGetValue(cdmwall.SymbolId, out cdmwall.CategoryCode);
cdmWalls.Add(cdmwall);
}
for (int i = 0; i < levels.Count(); i++)
{
for (int j = 0; j < dicWalls.Count; j++)
{
ElementId id = dicWalls.ElementAt(j).Key;
//归类cdm中同标高同类型
IEnumerable<CDMWall> targetcdm = from b in cdmWalls
where b.BaseLevel.Id.Equals(levels[i].Id) && b.SymbolId.Equals(id)
select b;
List<CDMWall> li = targetcdm.OrderByDescending(p => p.BasePoint.Y).ThenBy(p => p.BasePoint.X).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 < li.Count; k++)
{
if (k > 8)
{
if (k > 98)
{
li[k].LevelComponentCode = string.Format("{0}", k + 1);
}
else
{
li[k].LevelComponentCode = string.Format("0{0}", k + 1);
}
}
else
{
li[k].LevelComponentCode = string.Format("00{0}", k + 1);
}
}
}
}
return cdmWalls;
}
public static void PlaceWalls(Document doc, List<RevitWall> rwalls, Level level)
{
if (rwalls == null || level == null)
{
return;
}
var wallTypes = new FilteredElementCollector(doc).OfClass(typeof(WallType)).ToElements();
using (Transaction trans = new Transaction(doc))
{
trans.Start("创建墙");
foreach (var wall in rwalls)
{
foreach (WallType t in wallTypes)
{
if (t.Kind == WallKind.Basic)
{
string x = t.get_Parameter(BuiltInParameter.WALL_ATTR_WIDTH_PARAM).AsValueString();
if (x == wall.Thickness)
{
//var l = wall.BasePoint - wall.ExtendPoint;
Autodesk.Revit.DB.Line line = Autodesk.Revit.DB.Line.CreateBound(wall.BasePoint, wall.ExtendPoint);
var levelelev = level.get_Parameter(BuiltInParameter.LEVEL_ELEV).AsValueString();
Wall.Create(doc, line, t.Id, level.Id, wall.Height / 304.8, (Convert.ToDouble(wall.StrBaseElev) - Convert.ToDouble(levelelev)) / 304.8, false, false);
//Wall.Create(doc, line, t.Id, level.Id, wall.Height / 304.8, Convert.ToDouble(wall.StrTopElev) / 304.8, false, false);
break;
}
}
}
}
trans.Commit();
}
}
}
}