revit二次开发房间创建

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;

        }


    }
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周杰伦fans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值