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