下面的代码段应该删除任何不在工作表上的视图,或者在名为“查看所有者”的项目视图参数中没有值。我在一个空白项目上测试了这个,它似乎按计划工作。但是,在“真实”项目中,在搅拌和搅拌之后会返回以下错误....
Autodesk.Revit.Exceptions.InvalidObjectException:引用的对象无效,可能是因为它已从数据库中删除,或者其创建已撤消。在Autodesk的ProtectNativeInstance(Void * ptr)中的Autodesk.Revit.RevitAPIManagedWeakPointer.getValidPtr()在Microsoft.Scripting.Interpreter.FuncCallInstruction 2.Invoke(Object arg0) at IronPython.Runtime.Binding.PythonGetMemberBinder.FastPropertyGet
的Autodesk.Revit.DB.Element.get_Id()中。1.GetProperty(CallSite站点,TSelfType目标,CodeContext上下文)位于Microsoft.Scripting.Interpreter.LightLambda.Run2的Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame框架)中的Microsoft.Scripting.Interpreter.DynamicInstruction`3.Run(InterpretedFrame框架)[T0,T1, TRet](T0 arg0,T1 arg1)位于Revs.PythonShell.RpsRuntime.ScriptExecutor.ExecuteScript(String source)的Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope范围)中的IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)...
我不确定该怎么做。对于初学者来说,它是什么,它意味着什么?其次 - 我如何“抓住”这个并防止它抛出错误?我假设其中一个收集的元素是“无效的”?有没有办法确定对象是否无效并忽略它?有没有办法摆脱无效的对象?什么使对象无效?
__window__.Width = 1100
from Autodesk.Revit.DB import FilteredElementCollector, BuiltInCategory, View, Transaction
uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
selection = [ doc.GetElement( elId ) for elId in __revit__.ActiveUIDocument.Selection.GetElementIds() ]
views = []
viewstodelete = []
#Build the list full of views
if len(selection) == 0:
cl_views = FilteredElementCollector(doc)
views = cl_views.OfCategory( BuiltInCategory.OST_Views ).WhereElementIsNotElementType().ToElements()
else:
for sel in selection:
if isinstance(sel, View):
views.append(sel)
count = 0
#Get all views with a view owner
for v in views:
if (v.LookupParameter("Sheet Number") is None or v.LookupParameter("Sheet Number").AsString() == "---") and (v.LookupParameter("View Owner").AsString() is None or v.LookupParameter("View Owner").AsString() == ""):
if v.LookupParameter("View Name") is not None:
vOwner = v.LookupParameter("View Name").AsString()
count= count+1
viewstodelete.append(v)
else:
vOwner = "[View Template] - Not Deleted"
print(vOwner)
t = Transaction(doc, 'Delete Views')
t.Start()
for el in viewstodelete:
doc.Delete(el.Id)
t.Commit()
print "Views in Project: %s" % len(views)
print "Deleted views: %s" % count
我做了以下编辑,允许脚本继续运行,但是,这些“可能从数据库中删除”错误中的每一个都非常耗时... ...
for el in viewstodelete:
t.Start()
try:
doc.Delete(el.Id)
except Exception as e:
print("Error: %s" %str(e))
t.Commit()
答案 0 :(得分:2)
所有Revit元素都有IsValidObject
方法。您可以使用它来检查您的.NET包装器是否仍然有效。
文档说:
如果销毁相应的Revit本机对象,或撤消相应对象的创建,则包含它的托管API对象不再有效。无法在无效的包装器对象上调用API方法。
在您的情况下,视图之间可能存在某种依赖关系,因此当您删除视图时,会通过传播删除另一个视图。
答案 1 :(得分:0)
您检索的某些元素可能是系统所必需的,无法删除。您的异常处理程序看起来是朝着正确方向迈出的一大步。查看其打印输出以识别有问题的视图并确定如何首先跳过它们。可能有一个很好的理由不能删除它们。以下是对相关问题的进一步分析:
http://thebuildingcoder.typepad.com/blog/2012/03/melbourne-devlab.html