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);//revit/ 对应API RevitLinkLoadResult LinkLoadResult result = RevitLinkType.Create(doc, path, options);mit();}
2.将模型组rvt内实例复制到当前项目中
2.1需要创建一个实例并读取模型组rvt内部实例
2.2将复制过来的实例成组
2.3发现面板载入组后项目中不会存在组实例、链接文件,所以再删除就完成了
//加载模型组rvt文件using (Transaction trans = new Transaction(doc,"loadLink")){trans.Start();//2.1//revit/ 对应API RevitLinkLoadResult RevitLinkInstance instance = RevitLinkInstance.Create(doc, result.ElementId);Location location = instance.Location;location.Move(new XYZ(0, 0, 0));//2.1Document 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.1CopyPasteOptions copy = new CopyPasteOptions();copy.SetDuplicateTypeNamesHandler(new CopyEventHandler());ICollection<ElementId> newIds = ElementTransformUtils.CopyElements(linkDoc, lstElements, doc, null, copy);//2.2string typeName = RvtTools.ElementTool.Instance.GetParameterValue(instance2.LookupParameter("类型"));Group group = doc.Create.NewGroup(newIds);group.GroupType.Name = typeName.Split('.')[0];//2.3doc.Delete(group.Id);mit();}//2.3var 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);mit();}break;}