176 lines
7.6 KiB
C#
176 lines
7.6 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;
|
|||
|
|
|
|||
|
|
namespace CDM.Interop.Revit.Utility
|
|||
|
|
{
|
|||
|
|
class FloorUtil : Utility
|
|||
|
|
{
|
|||
|
|
public static List<CDMFloor> GetFloorsCDM(Document doc, IList<Element> levels, View3D v3d)
|
|||
|
|
{
|
|||
|
|
List<CDMFloor> cdmFloors = new List<CDMFloor>();
|
|||
|
|
var floors = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors).OfClass(typeof(Floor)).ToElements();
|
|||
|
|
//楼板类型及编号
|
|||
|
|
Dictionary<ElementId, string> dicFloors = new Dictionary<ElementId, string>();
|
|||
|
|
Dictionary<ElementId, string> dictLevelId_LevelCodes = GetDictLevelId_LevelCodes(doc);
|
|||
|
|
int num = 1;
|
|||
|
|
for (int i = 0; i < floors.Count; i++)
|
|||
|
|
{
|
|||
|
|
ElementId floortypeId = floors[i].GetTypeId();
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
dicFloors.Add(floortypeId, string.Format("00{0}", num));
|
|||
|
|
num += 1;
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
foreach (Floor floor in floors)
|
|||
|
|
{
|
|||
|
|
CDMFloor cdmfloor = new CDMFloor(doc, floor, v3d);
|
|||
|
|
|
|||
|
|
////通过out,将获取到的值复制给cdm的类型id,out参数必须在函数内初始化值
|
|||
|
|
dicFloors.TryGetValue(floor.FloorType.Id, out cdmfloor.CategoryCode);
|
|||
|
|
dictLevelId_LevelCodes.TryGetValue(cdmfloor.LevelId, out cdmfloor.LevelCode);
|
|||
|
|
cdmFloors.Add(cdmfloor);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (int i = 0; i < levels.Count(); i++)
|
|||
|
|
{
|
|||
|
|
for (int j = 0; j < dicFloors.Count; j++)
|
|||
|
|
{
|
|||
|
|
ElementId id = dicFloors.ElementAt(j).Key;
|
|||
|
|
//归类cdm中同标高同类型
|
|||
|
|
IEnumerable<CDMFloor> targetcdm = from d in cdmFloors
|
|||
|
|
where d.LevelId.Equals(levels[i].Id) && d.SymbolId.Equals(id)
|
|||
|
|
select d;
|
|||
|
|
//排序
|
|||
|
|
//var li = targetcdm.ToList();
|
|||
|
|
List<CDMFloor> li = targetcdm.OrderByDescending(p => p.Yw).ThenBy(p => p.Xl).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 cdmFloors;
|
|||
|
|
}
|
|||
|
|
private static CurveArray SetBoundary(XYZ rOrigin, double length, double width)
|
|||
|
|
{
|
|||
|
|
XYZ p1 = new XYZ(rOrigin.X, rOrigin.Y - width / 2, 0);
|
|||
|
|
XYZ p2 = new XYZ(rOrigin.X, rOrigin.Y + width / 2, 0);
|
|||
|
|
XYZ p3 = new XYZ(rOrigin.X + length, rOrigin.Y + width / 2, 0);
|
|||
|
|
XYZ p4 = new XYZ(rOrigin.X + length, rOrigin.Y - width / 2, 0);
|
|||
|
|
Autodesk.Revit.DB.Line line1 = Autodesk.Revit.DB.Line.CreateBound(p1, p2);
|
|||
|
|
Autodesk.Revit.DB.Line line2 = Autodesk.Revit.DB.Line.CreateBound(p2, p3);
|
|||
|
|
Autodesk.Revit.DB.Line line3 = Autodesk.Revit.DB.Line.CreateBound(p3, p4);
|
|||
|
|
Autodesk.Revit.DB.Line line4 = Autodesk.Revit.DB.Line.CreateBound(p4, p1);
|
|||
|
|
CurveArray lines = new CurveArray();
|
|||
|
|
lines.Append(line1);
|
|||
|
|
lines.Append(line2);
|
|||
|
|
lines.Append(line3);
|
|||
|
|
lines.Append(line4);
|
|||
|
|
return lines;
|
|||
|
|
}
|
|||
|
|
public static void PlaceFloors(Document doc, List<RevitFloor> rfloors, Level level)
|
|||
|
|
{
|
|||
|
|
if (rfloors == null || level == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var fts = new FilteredElementCollector(doc).OfClass(typeof(FloorType));
|
|||
|
|
|
|||
|
|
FloorType defft = new FilteredElementCollector(doc).OfClass(typeof(FloorType)).FirstOrDefault() as FloorType;
|
|||
|
|
var floorTypesCol = new FilteredElementCollector(doc).OfClass(typeof(FloorType));
|
|||
|
|
FloorType targetFloorType = null;
|
|||
|
|
using (Transaction trans = new Transaction(doc, "布置板"))
|
|||
|
|
{
|
|||
|
|
trans.Start();
|
|||
|
|
foreach (RevitFloor rfloor in rfloors)
|
|||
|
|
{
|
|||
|
|
Floor fl = null;
|
|||
|
|
|
|||
|
|
//var targetFloorName = rfloor.Name.Substring(rfloor.Name.IndexOf('@') + 1);
|
|||
|
|
var targetFloorName = rfloor.Thickness + "mm";
|
|||
|
|
var floorTypes = from f in floorTypesCol
|
|||
|
|
where f.Name == targetFloorName
|
|||
|
|
select f as FloorType;
|
|||
|
|
if (floorTypes.Count() == 0)
|
|||
|
|
{
|
|||
|
|
targetFloorType = defft.Duplicate(targetFloorName) as FloorType;
|
|||
|
|
CompoundStructure compound = targetFloorType.GetCompoundStructure();
|
|||
|
|
compound.SetLayerWidth(0, rfloor.Thickness / 304.8);
|
|||
|
|
targetFloorType.SetCompoundStructure(compound);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
targetFloorType = floorTypes.FirstOrDefault();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var arr = SetBoundary(rfloor.rOrigin, rfloor.Length / 304.8, rfloor.Width / 304.8);
|
|||
|
|
|
|||
|
|
fl = doc.Create.NewFloor(arr, targetFloorType, level, true);
|
|||
|
|
fl.get_Parameter(BuiltInParameter.FLOOR_HEIGHTABOVELEVEL_PARAM).Set(rfloor.Offest / 304.8);
|
|||
|
|
|
|||
|
|
doc.Regenerate();//设置完偏移量参数刷新
|
|||
|
|
|
|||
|
|
CreateOpenings(doc, fl, rfloor.Openings);
|
|||
|
|
}
|
|||
|
|
trans.Commit();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public static void CreateOpenings(Document doc, Floor floor, List<RevitOpening> ropenings)
|
|||
|
|
{
|
|||
|
|
foreach (var opening in ropenings)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
XYZ p1 = new XYZ(opening.rOrigin.X, opening.rOrigin.Y - opening.Width / 304.8 / 2, opening.rOrigin.Z);
|
|||
|
|
XYZ p2 = new XYZ(opening.rOrigin.X, opening.rOrigin.Y + opening.Width / 304.8 / 2, opening.rOrigin.Z);
|
|||
|
|
XYZ p3 = new XYZ(opening.rOrigin.X + opening.Length / 304.8, opening.rOrigin.Y + opening.Width / 304.8 / 2, opening.rOrigin.Z);
|
|||
|
|
XYZ p4 = new XYZ(opening.rOrigin.X + opening.Length / 304.8, opening.rOrigin.Y - opening.Width / 304.8 / 2, opening.rOrigin.Z);
|
|||
|
|
CurveArray curves = new CurveArray();
|
|||
|
|
|
|||
|
|
Line l1 = Line.CreateBound(p1, p2);
|
|||
|
|
Line l2 = Line.CreateBound(p2, p3);
|
|||
|
|
Line l3 = Line.CreateBound(p3, p4);
|
|||
|
|
Line l4 = Line.CreateBound(p4, p1);
|
|||
|
|
|
|||
|
|
curves.Append(l1);
|
|||
|
|
curves.Append(l2);
|
|||
|
|
curves.Append(l3);
|
|||
|
|
curves.Append(l4);
|
|||
|
|
|
|||
|
|
doc.Create.NewOpening(floor, curves, true);
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|