start

[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class CreateRoomAndCopyProperties : IExternalCommand
{
    public Result Execute(ExternalCommandData cmdData, ref string msg, ElementSet elements)
    {
        UIDocument uiDoc = cmdData.Application.ActiveUIDocument;
        Document doc = uiDoc.Document;
        Selection sel = uiDoc.Selection;
        //1.选择房间
        RoomFilter filter = new RoomFilter();
        Reference refRoom = sel.PickObject(ObjectType.Element, filter, "选择房间:");
        Room room = doc.GetElement(refRoom) as Room;
        //2.获取目标房间属性
        string roomName = room.get_Parameter(BuiltInParameter.ROOM_NAME).AsString();
        string roomDepartment = room.get_Parameter(BuiltInParameter.ROOM_DEPARTMENT).AsString();
        string roomOccupancy = room.get_Parameter(BuiltInParameter.ROOM_OCCUPANCY).AsString();
        //循环创建房间
        bool bContinue = true;
        while (bContinue)
        {
            XYZ point;
            try
            {
                //3.获取用户输入的点
                point = sel.PickPoint("点击要创建的房间中的一点:");
            }
            catch (Autodesk.Revit.Exceptions.InvalidOperationException ex)
            {
                bContinue = false;
                break;
            }
            catch (Exception)
            {
                bContinue = false;
                break;
            }
            //4.根据选中点,创建房间
            Transaction ts = new Transaction(doc, "http://revit.5d6d.com");
            ts.Start();
            //当前视图的楼层doc.ActiveView.GenLevel
            Room newRoom = doc.Create.NewRoom(doc.ActiveView.GenLevel, new UV(point.X, point.Y));
            if (newRoom == null)
            {
                msg = "创建房间失败。";
                return Result.Failed;
            }
            //5.读取房间的中心位置
            //简单房间只有一个实体
            GeometryObjectArray geomObjectArray = newRoom.ClosedShell.Objects;//
            GeometryObject geoObject = geomObjectArray.get_Item();
            Solid roomSolid = geoObject as Solid;
            //计算质心
            XYZ centriod = roomSolid.ComputeCentroid();
            //下降
            XYZ roomCenter = new XYZ(centriod.X, centriod.Y, doc.ActiveView.GenLevel.Elevation);
            //6.修改房间十字叉的位置
            LocationPoint roomLocation = newRoom.Location as LocationPoint;
            roomLocation.Point = roomCenter;
            //7.创建房间标签,放在中心
            RoomTag tag = doc.Create.NewRoomTag(newRoom, new UV(roomCenter.X, roomCenter.Y), doc.ActiveView);
            //8.赋值三个参数值,名称,用途,部门
            newRoom.get_Parameter(BuiltInParameter.ROOM_NAME).Set(roomName);
            newRoom.get_Parameter(BuiltInParameter.ROOM_DEPARTMENT).Set(roomDepartment);
            newRoom.get_Parameter(BuiltInParameter.ROOM_OCCUPANCY).Set(roomOccupancy);             ts.Commit();
        }         return Result.Succeeded;
    }
    public class RoomFilter : ISelectionFilter
    {         public bool AllowElement(Element elem)
        {
            return elem is Room;
        }         public bool AllowReference(Reference reference, XYZ position)
        {
            return true;
        }
    }
}

url:http://greatverve.cnblogs.com/p/CreateRoomAndCopyProperties1.html

Revit API创建房间的更多相关文章

  1. 【Revit API】梁构件支座检查算法

    一.前言         应该是第二次写关于Revit API的博文了.虽然在BIM企业中工作,从事桌面BIM软件开发,但是我是不怎么喜欢写Revit API相关的代码.平时更多的是在写界面展示,架构 ...

  2. Revit API 判断一个构件在某个视图中的可见性

    查看 Revit API.发现有Element::IsHidden这个方法.通过UI创建一个element,注意要使得这个element在某些视图可见,但是在另一些视图不可见.运行下面的方法,你会发现 ...

  3. Revit API 操作共享参数和项目参数

    1.获取共享参数 private string GetSharInfo(Autodesk.Revit.ApplicationServices.Application revitApp) { Strin ...

  4. Revit API射线法读取空间中相交的元素

    Revit API提供根据射线来寻找经过的元素.方法是固定模式,没什么好说.关键代码:doc.FindReferencesWithContextByDirection(ptStart, (ptEnd  ...

  5. Revit API 加载族并生成实例图元

    在Revit API中加载族可以使用Doc.LoadFamily方法,传入要加载的族文件路径名,但是这种方式有一种缺点,就是如果族文件在当前工程中没有加载的话则返回成功,如果已经加载过,则返回失败,也 ...

  6. 【Revit API】调用Revit内部命令PostableCommand

    Revit内置了一些命令,直接调用Revit操作方式. 可以去API文档查询PostableCommand枚举,还是很多的. 话不多说,直接上代码 var commandId = RevitComma ...

  7. 【Revit API】创建相机视角

    在Revit中有一个相机功能可以以相机视角产生一个视图.一开始我在Revit2016的API文档中找关键词Camera,但是没什么收获. 其实这个相机功能的真正核心是创建透视视图:View3D.Cre ...

  8. Revit API创建一个拷贝房间内对象布局命令

    本课程演示创建一个拷贝房间内对象布局命令,完整演示步骤和代码.这个命令把选中房间内的对象复制到其它选中的一个或多个房间中,而且保持与源房间一致的相对位置.通过本讲座使听众知道创建一个二次开发程序很简单 ...

  9. Revit API判断是不是柱族模板

    OwnerFamily即族模板.获取类别的方法:Document.Settings.Categories.get_Item(BuiltInCategory.OST_Columns); //判断是不是柱 ...

随机推荐

  1. 通用jsonp跨域技术获取天气数据

    1. 前言 在进行网站开发的过程中经常会用到第三方的数据,但是由于同源策略的限制导致ajax不能发送请求,因此也无法获得数据.解决ajax的跨域问题可以使用jsonp技术 2.代码 <!DOCT ...

  2. Redis的Multi的内幕真相

    今天遇到个Redis奇慢的问题,断点分析发现跟multi有关. 由于本人太忙不想去阅读Redis Server的源代码(其实是懒),就通过TCPDump来分析吧. 步骤: 1. 先在Redis Ser ...

  3. 关卡得分(if 嵌套for)与(for嵌套if)

  4. Dubbo入门---搭建一个最简单的Demo框架

    参考文档: https://blog.csdn.net/noaman_wgs/article/details/70214612/

  5. Flex 布局教程转载

    Flex 布局教程:语法篇 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html Flex 布局教程:实例篇 http://www.ruan ...

  6. Laravel Form 表单的数据校验

    例如,要使用手机号加验证码的方式提供登录网站的功能,那么在处理前端提交的 form 表单时,就不得不对提交的手机号及验证码做基本的数据校验. 手写规则,非常浪费时间.使用 laravel 内置的 va ...

  7. cf1020c 瞎搞

    枚举获胜状态即可 #include<iostream> #include<cstdio> #include<cstring> #include<cmath&g ...

  8. python 全栈开发,Day30(第一次面向对象考试)

    月考题: python 全栈11期月考题 一 基础知识:(70分) 1.文件操作有哪些模式?请简述各模式的作用(2分) 2.详细说明tuple.list.dict的用法,以及它们的特点(3分) 3.解 ...

  9. mysql中delete from in子查询删除失败

    遇到一个情况,想通过表1的id找到表2,删除表2中barcode关联的库存数据,然后一直不能失败,如下: delete from 库存表 where BARCODE in( select BARCOD ...

  10. POJ 1258 Agri-Net (Prim&Kruskal)

    题意:FJ想连接光纤在各个农场以便网络普及,现给出一些连接关系(给出邻接矩阵),从中选出部分边,使得整个图连通.求边的最小总花费. 思路:裸的最小生成树,本题为稠密图,Prim算法求最小生成树更优,复 ...