Revit二次开发-根据视图阶段(Phase)创建房间
最近开发业务中,有一个自动创建房间的功能,很自然的想到了Document.NewRooms2方法。但是当前功能的特殊之处在于,Revit项目视图是分阶段(Phase)的,不同阶段的房间是互相独立的。
官方API中创建房间提供了三个重载方法:
public ICollection<DB.ElementId> NewRooms2(Phase phase, int count);
public ICollection<DB.ElementId> NewRooms2(Level level);
public ICollection<DB.ElementId> NewRooms2(Level level, Phase phase)
第二个以前经常用,所以自然先用这个方法创建房间。但是结果不遂人意,因为项目视图是分阶段的,所以用这个方法在创建房间时,在有些视图是失败的,功能不稳定,所以这个方法不适用。
第一个方法是带有Phase参数的,但是个数又不确定,显然不满足需要。
第三个方法弥补第一个方法的不足,看上去应该满足需要,但是结果跟第一个差不多,在有些视图阶段是创建不出来房间的,会提示 阶段和当前视图不匹配的错误。这个就让人很困惑了。
没办法,只能求助百度了,刚好找到了网友的一片文章 https://blog.csdn.net/u010585773/article/details/83267904 其中介绍创建房间的方法,这篇博客讲了通过闭合区间创建房间,让做了好几年Revit开发的我找到了新大陆,原来Revit竟然提供了这个方法,一直没有研究过。于是系统的研究总结一下,提供下面两种创建方式:
第一种是在当前业务中使用:
private List<Room> CreateRooms()
{
List<Room> roomList = new List<Room>();
List<Level> levelList = wrapper.Doc.GetLevels().OrderBy(p => p.Elevation).ToList();
Level level = levelList[];
List<Phase> phaseList = wrapper.Doc.GetElements<Phase>();
List<ElementId> roomIdList = new List<ElementId>();
Phase viewPhase = wrapper.ActiveView.GetParameterElement(BuiltInParameter.VIEW_PHASE) as Phase;
double minRoomArea = (2.0).ConvertToAPI(DisplayUnitType.DUT_SQUARE_METERS);
Transaction trans = new Transaction(wrapper.Doc, "CreateRoom");
trans.Start();
try
{
PlanTopology planTopology = wrapper.Doc.get_PlanTopology(wrapper.ActiveView.GenLevel, viewPhase);
if (planTopology != null)
{
var arry = planTopology.Circuits;
foreach (PlanCircuit item in arry)
{
if (!item.IsRoomLocated && item.Area > minRoomArea)
{
Room room = wrapper.DocCreater.NewRoom(null, item);
roomList.Add(room);
}
}
}
trans.Commit();
}
catch (Exception ex)
{
trans.RollBack();
}
return roomList;
}
第二种是RevitAPI中官方示例:
Room InsertNewRoomInPlanCircuit(Autodesk.Revit.DB.Document document, Level level, Phase newConstructionPhase)
{
// create room using Phase
Room newScheduleRoom = document.Create.NewRoom(newConstructionPhase); // set the Room Number and Name
string newRoomNumber = "";
string newRoomName = "Class Room 1";
newScheduleRoom.Name = newRoomName;
newScheduleRoom.Number = newRoomNumber; // Get a PlanCircuit
PlanCircuit planCircuit = null;
// first get the plan topology for given level
PlanTopology planTopology = document.get_PlanTopology(level); // Iterate circuits in this plan topology
foreach (PlanCircuit circuit in planTopology.Circuits)
{
// get the first circuit we find
if (null != circuit)
{
planCircuit = circuit;
break;
}
} Room newRoom2 = null;
if (null != planCircuit)
{
using (Transaction transaction = new Transaction(document, "Create Room"))
{
if (transaction.Start() == TransactionStatus.Started)
{
// The input room must exist only in the room schedule,
// meaning that it does not display in any plan view.
newRoom2 = document.Create.NewRoom(newScheduleRoom, planCircuit);
// a model room with the same name and number is created in the
// view where the PlanCircuit is located
if (null != newRoom2)
{
// Give the user some information
TaskDialog.Show("Revit", "Room placed in Plan Circuit successfully.");
}
transaction.Commit();
}
}
} return newRoom2;
}
Revit二次开发-根据视图阶段(Phase)创建房间的更多相关文章
- Revit二次开发-BIM模型导出
最近一个月一直在研究Revit二次开发-BIM模型的导出,在网上找了很多相关资料学习.下面简单介绍一下我最近做的这个BIM模型的导出功能. 开始尝试使用Revit2015的样例程序里提供的读取模型几何 ...
- Revit二次开发之绘制钢筋
第一次在博客园上写东西,也不知道该写些什么,我想就写点最近项目到遇到的问题吧. 最近在做一个小项目,具体需求大概是在一个revit模型中的对应的楼板位置绘制钢筋. 由于刚接触Revit二次开发,之前也 ...
- Revit二次开发初体验
最近换了下工作,由之前的互联网企业转入了BIM软件开发行列.具体原因不多说,作为一个程序员来说学习永无止境.下面来一个Hello World体验下Revit的二次开发 事前准备 VS Revit 20 ...
- revit二次开发wpf里button按钮无法实现事务
不能在revit提供的api外部使用事务,解决此方法, 1.把button里要实现的功能写到外部事件IExternalEventHandler中,注册外部事件,在button事件中.raise()使用 ...
- Revit二次开发 推荐
学习revit二次开发,建议还是先把revit熟悉一下,去建立一下模型,亲自感受一下是如何创建模型的流程,其中会遇到什么问题.这样在自己做二次开发的时候,一些问题自己就能提前想到,规避掉.我大概用了半 ...
- revit二次开发之族的类型参数与实例参数的转换
1背景小伙伴在做revit二次开发的时候,可能需要在族环境中将族的类型参数与实例参数相互转换. 2思路1.使用族管理器FamilyManager,参见注释12.首先获取需要转换的参数(单个与批量),参 ...
- Revit二次开发实现BIM盈利(以橄榄山快模为例解说) 视频讲座下载
应笔墨闲谈群的邀请, 在10月11号晚8:30分在其群做了一次关于BIM二次开发的讲座. 因为參与者基本上都是从设计院和施工单位来的,所以对Revit二次开发做了纵览性的解说, 以非程序猿能听懂的方式 ...
- Autodesk 招聘Revit二次开发咨询顾问,与Autodesk全球团队紧密合作,提高职业生涯的好机会
朋友们, 因为我离开Autodesk的全职工作(变为部分时间工作),我的职位空出.急招这个职位.请踊跃把你周围的朋友推荐给Autodesk. 请将简历发给我转交给Autodesk 我的邮箱yexion ...
- [Revit]Autodesk Revit 二次开发整理(资料、准备工作和环境搭建)
1 前言 Revit被Autodesk收购之后,整理和开放了一大部分API,供开发者实现自己的功能和程序,总体来说API的功能比较完善,毕竟市面上已经出现了各式各样的插件. 本人也是初学者,在Revi ...
随机推荐
- 【转】Zookeeper学习---zookeeper 选举机制介绍
[原文]https://www.toutiao.com/i6593162565872779784/ zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的 ...
- [转]Redis学习---Redis高可用技术解决方案总结
[原文]https://www.toutiao.com/i6591646189714670093/ 本文主要针对Redis常见的几种使用方式及其优缺点展开分析. 一.常见使用方式 Redis的几种常见 ...
- Hadoop HBase概念学习系列之HMaster服务器(四)
每台HRegion服务器都会和HMaster服务器通信,HMaster的主要任务就是告诉每个HRegion服务器它要维护哪些HRegion. 当一台新的HRegion服务器登录到HMaster服务器时 ...
- ActiveX多线程回调JavaScript
http://www.cnblogs.com/zdxster/archive/2011/01/27/1945872.html
- 一些安卓模拟器的IP问题和getOutputStream();关于connect();的函数异常的问题
ip问题 1.不能使用local host 和127.0.0.1作为本地服务器的地址,而网上无论10.0.0.2还是10.0.2.2的8080端口都无法访问.真正的地址应该在CMD 键入ipconfi ...
- C内存开辟与平移
- Android An unexpected exception occurred while creating a change object. see the error log for more details
今天再给Android项目工程中的包重命名时出现了这个错误(之前重命名的时候就没有出现,郁闷):An unexpected exception occurred while creating a ch ...
- 微信小程序开发 [06] 一些补充的知识点
0.写在前面的话 前几章的内容串联起来,基本上已经能写比较基础的小程序页面逻辑了,当然,wxml和wxss的我并没有写,因为前端我也并不擅长.这个章节,准备随便叨叨,然后补充一些之前没有提到的基础知识 ...
- struts2_E_commerce_maven
这是作业的第二题:使用struts实现电子商务网站,这是基于之前的代码的,所以,主要就是修改成为struts的mvc模式. 1.开始,先把以前做的一个maven项目修改成为另一个项目(简称重命名) 重 ...
- android获取内置和外置SD卡路径 - z
本文将介绍Android真机环境下如何获取内置和外置SD卡路径. 测试环境:三星Note3,其他手机待测试... 所需权限(AndroidManifest.xml文件里) <uses-permi ...