在程序中删除视图


转载请复制以下信息:
原文链接: 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();
			
			
			
		}


同样的,不仅仅是删除视图,删除其它对象也是有同样的。




 

你可能感兴趣的:(delete)