1.创建一个模型组
2.将模型组保存为rvt文件
3.通过程序将模型组rvt文件导入到Revit
前两步略过。
我找了半天并没有找到可以直接将rvt文件导入转换成模型组的API,
于是先用面板按钮看看流程是怎样的。
点击面板按钮将保存好的模型组rvt文件(我绘制了几面墙)加载进来
然后加载过程中弹出提示框
看到提示我了解到模型组rvt中的墙实例是被复制到当前项目文档的,
点击确定,从项目浏览器可以找到导入的模型组
分析过程:
1.模型组导出的是rvt文件,可得出加载时要把rvt文件导入
2.重复类型提示框,可得出是将模型组rvt内的实例复制到当前文档
实现过程:
1.将模型组rvt导入项目中
//加载模型组rvt文件
using (Transaction trans = new Transaction(doc,"loadLink"))
{
trans.Start();
//1.
FilePath path = new FilePath(_rvtPath);
RevitLinkOptions options = new RevitLinkOptions(false);
//revit2016/2017 对应API RevitLinkLoadResult
LinkLoadResult result = RevitLinkType.Create(doc, path, options);
trans.Commit();
}
2.将模型组rvt内实例复制到当前项目中
2.1需要创建一个实例并读取模型组rvt内部实例
2.2将复制过来的实例成组
2.3发现面板载入组后项目中不会存在组实例、链接文件,所以再删除就完成了
//加载模型组rvt文件
using (Transaction trans = new Transaction(doc,"loadLink"))
{
trans.Start();
//2.1
//revit2016/2017 对应API RevitLinkLoadResult
RevitLinkInstance instance = RevitLinkInstance.Create(doc, result.ElementId);
Location location = instance.Location;
location.Move(new XYZ(0, 0, 0));
//2.1
Document linkDoc = instance2.GetLinkDocument();
FilteredElementCollector fec = new FilteredElementCollector(linkDoc);
ElementClassFilter filter1 = new ElementClassFilter(typeof(HostObject));
ElementClassFilter filter2 = new ElementClassFilter(typeof(FamilyInstance));
LogicalOrFilter logicalAndFilter = new LogicalOrFilter(filter1, filter2);
ICollection<ElementId> lstElements = fec.WherePasses(logicalAndFilter).ToElementIds();
//2.1
CopyPasteOptions copy = new CopyPasteOptions();
copy.SetDuplicateTypeNamesHandler(new CopyEventHandler());
ICollection<ElementId> newIds = ElementTransformUtils.CopyElements(linkDoc, lstElements, doc, null, copy);
//2.2
string typeName = RvtTools.ElementTool.Instance.GetParameterValue(instance2.LookupParameter("类型"));
Group group = doc.Create.NewGroup(newIds);
group.GroupType.Name = typeName.Split('.')[0];
//2.3
doc.Delete(group.Id);
trans.Commit();
}
//2.3
var collector = new FilteredElementCollector(doc);
foreach (Element element in collector.OfClass(typeof(RevitLinkType)))
{
ExternalFileReference extFileRef = element.GetExternalFileReference();
if (null == extFileRef || extFileRef.GetLinkedFileStatus() != LinkedFileStatus.Loaded || !element.Name.Equals(typeName))
continue;
var revitLinkType = (RevitLinkType)element;
revitLinkType.Unload(null);
using (Transaction trans = new Transaction(doc, "unloadLink"))
{
trans.Start();
doc.Delete(revitLinkType.Id);
trans.Commit();
}
break;
}