Revit二次开发---载入模型组
时间:2023-11-03 16:07:02
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 lstElements = fec.WherePasses(logicalAndFilter).ToElementIds(); //2.1 CopyPasteOptions copy = new CopyPasteOptions(); copy.SetDuplicateTypeNamesHandler(new CopyEventHandler()); ICollection 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; }