|
下面这段代码是删除所有的平面视图(不管这个在现实中是否需要,假定有这个操作),会发现错误,无法删除。
这个代码中不删除当前视图,避开当前视图。代码是Revit 2013 的SharpDevelop代码。- <p>
- </p><p>[csharp] view plaincopy</p><p> public void DeleteViews() </p><p> { </p><p> </p><p> //retrieve all views. </p><p> Document doc = this.ActiveUIDocument.Document; </p><p> FilteredElementCollector collector = new FilteredElementCollector(doc); </p><p> collector.OfClass(typeof(View)); </p><p> </p><p> Transaction trans = new Transaction(doc); </p><p> trans.Start("deleteViews"); </p><p> foreach(Element elem in collector) </p><p> { </p><p> if(elem is View) </p><p> { </p><p> View view = elem as View; </p><p> if(view.IsTemplate != true) </p><p> { </p><p> if(view.Id.IntegerValue != doc.ActiveView.Id.IntegerValue) </p><p> { </p><p> if(view is ViewPlan) </p><p> { </p><p> TaskDialog.Show("delete view",view.Name); </p><p> doc.Delete(view); </p><p> </p><p> } </p><p>}}}}trans.Commit();} </p>
复制代码 原因在哪里?
原因就在这个FilteredElementCollector collector 对象上。
通过给定一个类条件,我们可以获得一个对象集合collector。
然后对这个对象集合中的对象进行遍历和删除操作。
当删除时,实际上改变了collector对象集合,因为删除的对象也是其中的一个成员。FilteredElementCollector 对象不允许在遍历中被改变。
那怎么实现删除对象? 可以把满足条件的对象放到一个IList<Element> 集合中,然后对其中的对象进行删除。
下面代码则运行顺畅。- <p></p><p>
- </p><p>[csharp] view plaincopy</p><p>public void DeleteViews() </p><p>{ </p><p> </p><p> //retrieve all views. </p><p> Document doc = this.ActiveUIDocument.Document; </p><p> FilteredElementCollector collector = new FilteredElementCollector(doc); </p><p> collector.OfClass(typeof(View)); </p><p> </p><p> IList<Element> lists = collector.ToElements(); </p><p> </p><p> Transaction trans = new Transaction(doc); </p><p> trans.Start("deleteViews"); </p><p> foreach(Element elem in lists) </p><p> { </p><p> if(elem is View) </p><p> { </p><p> View view = elem as View; </p><p> if(view.IsTemplate != true) </p><p> { </p><p> //if(view.Id.IntegerValue != doc.ActiveView.Id.IntegerValue) </p><p> { </p><p> if(view is ViewPlan) </p><p> { </p><p> TaskDialog.Show("delete view",view.Name); </p><p> doc.Delete(view); </p><p> </p><p> } </p><p> } </p><p> } </p><p> } </p><p> } </p><p> trans.Commit(); </p><p> </p><p> </p><p> </p><p>} </p>
复制代码 同样的,不仅仅是删除视图,删除其它对象也是有同样的。
转载请复制以下信息:
原文链接: http://blog.csdn.net/joexiongjin/article/details/7873970
作者: 叶雄进 , Autodesk ADN
|
|