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