Revit API 加载族并生成实例图元
在Revit API中加载族可以使用Doc.LoadFamily方法,传入要加载的族文件路径名,但是这种方式有一种缺点,就是如果族文件在当前工程中没有加载的话则返回成功,如果已经加载过,则返回失败,也就是拿不到FamilySymbol实例,而根据族生成实例图元又需要这个FamilySymbol。网上看到有些帖子说可以传入IFamilyLoadOptions实例就可以,但是笔者多次尝试,该方法均没有成功,始终返回失败,无奈放弃这种方法,改为在当前工程中查找该族是否加载过,如果加载则直接返回FamilySymbol实例,否则加载族文件,下面贴出代码。
该代码在Revit 2016 + VS2013下调试通过:
public class CreateFamilyInstance : IExternalCommand
{
private class FamilyLoadOptions : IFamilyLoadOptions
{
public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
{
overwriteParameterValues = true;
return true;
} public bool OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
{
source = FamilySource.Family;
overwriteParameterValues = true;
return true;
}
} private FamilySymbol FindFamilySymbol(Document rvtDoc, string familyName, string symbolName)
{
FilteredElementCollector collector = new FilteredElementCollector(rvtDoc);
FilteredElementIterator itr = collector.OfClass(typeof(Family)).GetElementIterator();
itr.Reset();
while (itr.MoveNext())
{
Autodesk.Revit.DB.Element elem = (Autodesk.Revit.DB.Element)itr.Current;
if (elem.GetType() == typeof(Autodesk.Revit.DB.Family))
{
if (elem.Name == familyName)
{
Autodesk.Revit.DB.Family family = (Autodesk.Revit.DB.Family)elem;
foreach (Autodesk.Revit.DB.ElementId symbolId in family.GetFamilySymbolIds())
{
Autodesk.Revit.DB.FamilySymbol symbol = (Autodesk.Revit.DB.FamilySymbol)rvtDoc.GetElement(symbolId);
if (symbol.Name == symbolName)
{
return symbol;
}
}
}
}
}
return null;
} public Autodesk.Revit.UI.Result Execute(ExternalCommandData cmdData,
ref string message, Autodesk.Revit.DB.ElementSet elements)
{
UIApplication app = cmdData.Application;
Document doc = app.ActiveUIDocument.Document;
Transaction trans = new Transaction(doc, "ExComm");
trans.Start();
Family fs = null;
FamilySymbol symbol = null;
doc.LoadFamily(@"C:\\ProgramData\\Autodesk\\RVT 2016\\Libraries\\China\\结构\\柱\\混凝土\\混凝土柱-T形.rfa",
new FamilyLoadOptions(), out fs);
if (fs != null)
{
foreach (ElementId symbolId in fs.GetFamilySymbolIds())
{
Element elem = doc.GetElement(symbolId);
if (null != elem)
{
symbol = elem as FamilySymbol;
if (null != symbol)
{
TaskDialog.Show("Info", symbol.Name);
TaskDialog.Show("Info", symbol.FamilyName); break;
}
}
}
}
else
{
symbol = FindFamilySymbol(doc, "混凝土柱-T形", "标准");
if (null != symbol)
{
TaskDialog.Show("Info", symbol.Name);
TaskDialog.Show("Info", symbol.FamilyName);
}
} if (null != symbol)
{
if (!symbol.IsActive)
symbol.Activate();
XYZ point = new XYZ(10, 10, 10);
//创建族实例
FamilyInstance fi = doc.Create.NewFamilyInstance(point, symbol,
Autodesk.Revit.DB.Structure.StructuralType.Column);
}
else
{
TaskDialog.Show("erorr", "FamilySymbol为空");
}
trans.Commit(); return Autodesk.Revit.UI.Result.Succeeded;
}
}
Revit API 加载族并生成实例图元的更多相关文章
- [原][译][osgearth]API加载地球(OE官方文档翻译)
原文参考:http://docs.osgearth.org/en/latest/developer/maps.html#programmatic-map-creation 本人翻译水平有限... 加载 ...
- ArcGIS Javascript API 加载高德在线地图扩展
利用ArcGIS JavaScript API加载高德在线地图的扩展 /** * Created by WanderGIS on 2015/7/15. */ define(["dojo/_b ...
- PHP+Ajax点击加载更多列表数据实例
一款简单实用的PHP+Ajax点击加载更多列表数据实例,实现原理:通过“更多”按钮向服务端发送Ajax请求,PHP根据分页参数查询将最新的几条记录,数据以JSON形式返回,前台Query解析JSON数 ...
- 三种动态加载js的jquery实例代码另附去除js方法
!-- 这里为你提供了三种动态加载js的jquery实例代码哦,由于jquery是为用户提供方便的,所以利用jquery动态加载文件只要一句话$.getscript("test.js&quo ...
- CS.动态加载DLL.动态生成.运行代码.BS.AutoFac管理实现类
以英雄联盟为例.界面上经常有Load....xxxx.dll.一般都是加载子系统.比如装备系统.英雄系统等.在实际开发中很多项目非常庞大.都会分割成独立子解决方案开发.后期就需要加载回来.一般都是利用 ...
- js实现『加载更多』功能实例
DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...
- web工程中web.xml元素加载顺序以及配置实例
简介 web.xml是web工程的配置文件,容器加载web工程时,会首先从WEB-INF中查询web.xml,并加载其中的配置信息,可以将web.xml认为是web工程的入口. web.xml中包含有 ...
- 详谈 Unity3D AssetBundle 资源加载,结合实际项目开发实例
第一次搞资源更新方面,这里只说更新,加载,AssetBundle资源加载,谈谈自己的理解,以及自己在项目中遇到的那些神坑,现在回想一下,真的是自己跪着过来的,说多了,都是泪. 我这边是安卓AssetB ...
- js实现动态加载脚本的方法实例汇总
本文实例讲述了js实现动态加载脚本的方法.分享给大家供大家参考,具体如下: 最近公司的前端地图产品需要做一下模块划分,希望用户用到哪一块的功能再加载哪一块的模块,这样可以提高用户体验. 所以到处查 ...
随机推荐
- 用了皮肤控件之后,报错:容量超出了最大容量 参数名:capacity
用了皮肤控件之后,报错:容量超出了最大容量 参数名:capacity MessageBox.show()错误!!容量超出了最大容量.参数名: capacity 解决方案: 设置 skin.SkinDi ...
- web前端切图处理
技巧: 一. 如何在 Retina 屏幕的设备使用更高分辨率的图片 以 MacBook Pro 为例,它的标准分辨率高达 2560 x 1600,但是如果真的以这个分辨率显示网页,网页的有效区域就小的 ...
- kill word out e ef en em
1● e 2● ef 出,出来 3● en 4● em 使~进入状态,包围,进入~之中
- bzoj1091
题解: 暴力枚举顺序 然后计算几何 代码: #include<bits/stdc++.h> ],lp=; double v1,v2,ans=1e10; struct pos { doubl ...
- 日期控件:My97DatePicker
My97DatePicker是一款非常灵活好用的日期控件.使用非常简单. 1.下载My97DatePicker组件包 下载地址:http://download.csdn.net/detail/emov ...
- C标准中一些预定义的宏,如__FILE__,__func__等
C标准中一些预定义的宏 C标准中指定了一些预定义的宏,对于编程经常会用到.下面这个表中就是一些常常用到的预定义宏. 宏 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串 ...
- DevExpress v17.2新版亮点—WinForms篇(一)
用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.开篇介绍了DevExpress WinForms v17.2 Data Grid Control ...
- 不挣扎了,MVC验证错误信息汇总是酱紫的
public static string GetModelErros(this ModelStateDictionary dic) { var sb = new StringBuilder(); va ...
- Android下打印堆栈的两种方法
1. for(StackTraceElement i:Thread.currentThread().getStackTrace()){ System.out.println(i); } 2. Log. ...
- ADB命令行工具使用
Putty工具连接Android设备 下载链接:https://github.com/sztupy/adbputty/downloads 如上图所示:在HostName中输入transport-usb ...