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