用API能否修改Revit链接模型

本文探讨了Revit中链接模型的编辑方法。由于直接编辑链接模型受限,文章提供了通过卸载链接模型,后台修改后再重新加载的方法,并给出了具体的C#实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Revit使用协同的方式有工作集模式和链接模型的模式.  在工作集模式,协同和参照很容易. 链接模型可以参照但是修改起来比较麻烦.

一直由一个疑问,可否通过编写程序的方式来修改模型里的链接文档.

不试不知道,通过一个小例子测试可行性. SharpDevelop代码如下;

public void CreateElementInLinkModel()
		{
			Selection sel = this.ActiveUIDocument.Selection;
			Document doc = this.ActiveUIDocument.Document;		
			Reference ref1 = sel.PickObject(ObjectType.Element,"please pick  a linked model");
			RevitLinkInstance linkedInstance = doc.GetElement(ref1) as RevitLinkInstance;
			
			ElementId typeId = linkedInstance.GetTypeId();
		    RevitLinkType linkType = doc.GetElement(typeId) as RevitLinkType;
		    string docName = linkType.Name;
		
		    //find its document.
		    Document linkDoc = null;
		    foreach (Document d in doc.Application.Documents)
		    {
		      if (d.Title == docName)
		      {
		        linkDoc = d;
		        break;
		      }
		    }
		    
		    Transaction trans = new Transaction(linkDoc);
		    trans.Start("createALine");
		    
		    Line l = this.Application.Create.NewLineBound(new XYZ(0,0,0),new XYZ(1000,1000,0));
		    
		    //
		    FilteredElementCollector collector = new FilteredElementCollector(linkDoc);
		    collector.OfClass(typeof(ViewPlan));
		    ViewPlan vp = collector.FirstElement() as ViewPlan;
		    
		    
		    linkDoc.Create.NewModelCurve(l,vp.SketchPlane);
		    
		    trans.Commit();
		    linkDoc.Save();

		
		}


运行后,提示

Autodesk.Revit.Exceptions.ArgumentException: Document is a linked file. Transactions can only be used in primary documents (projects or families.)
Parameter name: document


意思是对于非主要文档,我们无法启动一个事务. 所以无法直接修改一个连接模型对象.


后来又尝试先卸载连接模型. 然后在从后台打开这个链接模型的rvt文件. 修改完该模型后,再次加载该连接文件.  实验成功. 成功绘制了一条线. 并可以加载. 就是稍有点闪烁.


		public void EditLinkModelLoadBackGround()
		{
			Selection sel = this.ActiveUIDocument.Selection;
			Document doc = this.ActiveUIDocument.Document;		
			Reference ref1 = sel.PickObject(ObjectType.Element,"please pick  a linked model");
			RevitLinkInstance linkedInstance = doc.GetElement(ref1) as RevitLinkInstance;
			
			ElementId typeId = linkedInstance.GetTypeId();
		    RevitLinkType linkType = doc.GetElement(typeId) as RevitLinkType;
		    string docName = linkType.Name;
		
		    //find its document.
		    Document linkDoc = null;
		    foreach (Document d in doc.Application.Documents)
		    {
		      if (d.Title == docName)
		      {
		        linkDoc = d;
		        break;
		      }
		    }
		    
		    string linkDocFullName = linkDoc.PathName;
		    linkType.Unload(new myoverload());
		    
		    
		    Document backGroundDoc = this.Application.OpenDocumentFile( linkDocFullName);
		     
		    Transaction trans = new Transaction(backGroundDoc);
		    trans.Start("createALine");
		    
		    Line l = this.Application.Create.NewLineBound(new XYZ(0,0,0),new XYZ(1000,100,0));
		    
		    //
		    FilteredElementCollector collector = new FilteredElementCollector(backGroundDoc);
		    collector.OfClass(typeof(ViewPlan));
		    ViewPlan vp = collector.FirstElement() as ViewPlan;
		    
		    
		    backGroundDoc.Create.NewModelCurve(l,vp.SketchPlane);
		    
		    trans.Commit();
		    backGroundDoc.Save();
		    backGroundDoc.Close(false);

		    linkType.Load();
		
		}


这篇文章比较有价值, 可能能解决大家在编程中的很多需求.


作者: 叶雄进--橄榄山BIM软件

转载请注明作者和来源

原文地址: http://blog.csdn.net/joexiongjin/article/details/38537729





评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值