using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CreateRoom
{
[TransactionAttribute(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
UIApplication uIApp = null;
UIDocument uIDocument = null;
Document document = null;
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
uIApp = commandData.Application;
Application application = uIApp.Application;
uIDocument = uIApp.ActiveUIDocument;
document = uIDocument.Document;
using (Transaction transaction = new Transaction(document, "创建房间"))
{
transaction.Start();
List<ElementId> ids = GetDoorByRoom();
uIDocument.Selection.SetElementIds(ids);
transaction.Commit();
}
return Result.Succeeded;
}
/// <summary>
/// 创建房间
/// </summary>
/// <returns></returns>
public Room CreateRoom()
{
XYZ xyz = uIDocument.Selection.PickPoint();
View view = document.ActiveView;
Level level = view.GenLevel;
UV uV = new UV(xyz.X, xyz.Y);
Room room = document.Create.NewRoom(level, uV);
room.Name = "客厅";
room.get_Parameter(BuiltInParameter.ROOM_UPPER_OFFSET).Set(ToFoot(4000.0));
return room;
}
/// <summary>
/// 创建面积
/// </summary>
/// <returns></returns>
public Area NewArea()
{
View view = document.ActiveView;
ViewPlan viewPlan = view as ViewPlan;
XYZ xyz = uIDocument.Selection.PickPoint();
UV uV = new UV(xyz.X, xyz.Y);
Area area = document.Create.NewArea(viewPlan, uV);
return area;
}
/// <summary>
/// 创建多个房间
/// </summary>
public Room CreateRoomes()
{
View view = document.ActiveView;
Level level = view.GenLevel;
ICollection<ElementId> ids = document.Create.NewRooms2(level);
Room room = null;
foreach (ElementId item in ids)
{
room = document.GetElement(item) as Room;
}
return room;
}
/// <summary>
/// 创建房间标签
/// </summary>
/// <returns></returns>
public RoomTag CreateRoomTag()
{
View view = document.ActiveView;
ElementId id = view.Id;
Reference reference = uIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, new RoomFilter());
Room room = document.GetElement(reference) as Room;
XYZ point = (room.Location as LocationPoint).Point;
UV uV = new UV(point.X, point.Y);
LinkElementId linkElementId = new LinkElementId(room.Id);
RoomTag tag = document.Create.NewRoomTag(linkElementId, uV, id);
return tag;
}
/// <summary>
/// 获得与房间有关的所有门
/// </summary>
/// <returns></returns>
public List<ElementId> GetDoorByRoom()
{
//View view = document.ActiveView;
//选房间
Reference reference = uIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, new RoomFilter());
Room room = document.GetElement(reference) as Room;
Level level = room.Level;
//获取视图
FilteredElementCollector viewFiltered = new FilteredElementCollector(document);
List<ViewPlan> viewPlans = viewFiltered.OfClass(typeof(ViewPlan)).Cast<ViewPlan>().ToList();
ViewPlan viewPlan = null;
foreach (ViewPlan item in viewPlans)
{
if (item.Name.Equals("标高 1") && item.GenLevel.Id == level.Id)
{
ElementId id = item.GetTypeId();
ViewFamilyType viewFamilyType = document.GetElement(id) as ViewFamilyType;
if (viewFamilyType.Name.Equals("楼层平面"))
{
viewPlan = item;
break;
}
}
}
ElementId viewId = viewPlan.Id;
//过滤器得到门
FilteredElementCollector collector = new FilteredElementCollector(document, viewId);
List<FamilyInstance> doors = collector.OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilyInstance)).Cast<FamilyInstance>().ToList();
//得到和选择房间有关的门
List<ElementId> doorIds = new List<ElementId>();
foreach (FamilyInstance item in doors)
{
if ((item.Room != null && item.Room.Id == reference.ElementId) || (item.FromRoom != null && item.FromRoom.Id == reference.ElementId)
|| (item.Room != null && item.Room.Id == reference.ElementId))
{
doorIds.Add(item.Id);
}
}
return doorIds;
}
/// <summary>
/// 房间过滤器
/// </summary>
public class RoomFilter : ISelectionFilter
{
public bool AllowElement(Element elem)
{
if (elem is Room)
{
return true;
}
return false;
}
public bool AllowReference(Reference reference, XYZ position)
{
return true;
}
}
/// <summary>
/// 毫米转英尺
/// </summary>
/// <param name="var">毫米</param>
/// <returns></returns>
public double ToFoot(double var)
{
double f = UnitUtils.ConvertToInternalUnits(var, DisplayUnitType.DUT_MILLIMETERS);
return f;
}
}
}
12-24
2018
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交