Revit API 无效对象
Posted
技术标签:
【中文标题】Revit API 无效对象【英文标题】:Revit API Invalid Object 【发布时间】:2016-06-27 11:36:03 【问题描述】:下面的 sn-p 应该删除任何不在工作表上的视图,或者在名为“视图所有者”的项目视图参数中不存在任何值。我已经在一个空白项目上对此进行了测试,它似乎按计划工作。然而,在“真正的”项目上,在搅动和搅动之后返回以下错误....
Autodesk.Revit.Exceptions.InvalidObjectException:引用的对象无效,可能是因为它已从数据库中删除,或者它的创建已撤消。在 validateNativeInstance(Void* ptr) 在 Autodesk.Revit.RevitAPIManagedWeakPointer.getValidPtr() 在 Autodesk.Revit.DB.Element.get_Id() 在 Microsoft.Scripting.Interpreter.FuncCallInstruction2.Invoke(Object arg0) at IronPython.Runtime.Binding.PythonGetMemberBinder.FastPropertyGet
1.GetProperty(CallSite 站点,TSelfType 目标, CodeContext 上下文)在 Microsoft.Scripting.Interpreter.DynamicInstruction`3.Run(InterpretedFrame frame) 在 Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame) 在 Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,Tret] (T0 arg0, T1 arg1) 在 IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx) 在 Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope scope) 在 RevitPythonShell.RpsRuntime.ScriptExecutor.ExecuteScript(String source)...强>
我真的不知道该怎么做。首先,它是什么,它意味着什么?其次 - 我将如何“捕捉”这个并防止它抛出错误?我假设收集的元素之一是“无效的”?有没有办法确定一个对象是否无效并忽略它?有没有办法摆脱无效对象?什么使对象无效?
__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()
【问题讨论】:
【参考方案1】:所有 Revit 图元都有一个 IsValidObject
方法。您可以使用它来检查您的 .NET 包装器是否仍然有效。
文档说:
如果相应的 Revit 本机对象被破坏,或相应对象的创建被撤消,则包含它的托管 API 对象不再有效。不能对无效的包装对象调用 API 方法。
在您的情况下,视图之间可能存在一些依赖关系,因此当您删除一个时,另一个会通过传播删除。
【讨论】:
这很有趣。我昨天开始怀疑从属见。我们有许多依赖于主要视图的视图。可能是在受抚养人之前删除了主要视图 - 显然,当他们被要求删除时,它们将不存在。非常感谢你们...【参考方案2】:您正在检索的某些元素可能是系统需要的,因此无法删除。您的异常处理程序看起来是朝着正确方向迈出的一大步。查看打印输出以确定有问题的视图并确定如何首先跳过它们。不能删除它们可能有充分的理由。以下是对相关问题的一些进一步分析:
http://thebuildingcoder.typepad.com/blog/2012/03/melbourne-devlab.html
http://thebuildingcoder.typepad.com/blog/2015/10/rtc-classes-and-getting-started-with-revit-macros.html#24
【讨论】:
以上是关于Revit API 无效对象的主要内容,如果未能解决你的问题,请参考以下文章
错误:对象无效作为React子级(Axios和openweathermap API)
配置对象无效。 Webpack 已使用与 ReactJS 中的 API 模式不匹配的配置对象进行初始化
配置对象无效。 Webpack 已使用与 Angular 中的 API 架构不匹配的配置对象进行初始化
无效的选项对象。已使用与 API 架构不匹配的选项对象初始化开发服务器