revit-api - 使用 RevitPythonShell 的可扩展存储

标签 revit-api revitpythonshell pyrevit

我正在尝试利用 Revit API 中的 ExtensibleStorage。我正在尝试将数组存储在 ArrayField 中。我想也许我的错误是由于 IronPython 接口(interface)造成的,但也许有人已经成功地做到了这一点?我知道要设置的对象应该是一个 IList,但我似乎无法制作一个。在 IronPython 文档中,使用数组对象作为示例。如果我尝试这样做: vl = IList[ElementId]([v.ViewId for v in views]) 我收到系统错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
SystemError: MakeGenericType on non-generic type

这是我的代码:

from System import Guid, Array
from Autodesk.Revit.DB.ExtensibleStorage import *

guid = Guid.NewGuid()
views = revit.uidoc.GetOpenUIViews()
vl = Array[ElementId]([v.ViewId for v in views])

schemaBuilder = SchemaBuilder(guid)
schemaBuilder.SetReadAccessLevel(AccessLevel.Public)
schemaBuilder.SetWriteAccessLevel(AccessLevel.Public)
schemaBuilder.SetSchemaName('Testing')
schemaBuilder.AddArrayField('Views', ElementId)
schema = schemaBuilder.Finish()

entity = Entity(schema)
entity.Set('Views', vl)

这是我的错误消息:

Exception : Autodesk.Revit.Exceptions.InvalidOperationException: Unsupported type: Autodesk.Revit.DB.ElementId[]
   at Autodesk.Revit.DB.ExtensibleStorage.Entity.Set[FieldType](String fieldName, FieldType value, ForgeTypeId unitTypeId)
   at Autodesk.Revit.DB.ExtensibleStorage.Entity.Set[FieldType](String fieldName, FieldType value)

顺便说一句:这工作正常:

from System import Guid, Array
from Autodesk.Revit.DB.ExtensibleStorage import *

guid = Guid.NewGuid()
views = revit.uidoc.GetOpenUIViews()
v = views[0].ViewId

schemaBuilder = SchemaBuilder(guid)
schemaBuilder.SetReadAccessLevel(AccessLevel.Public)
schemaBuilder.SetWriteAccessLevel(AccessLevel.Public)
schemaBuilder.SetSchemaName('Testing')
schemaBuilder.AddSimpleField('Views', ElementId)
schema = schemaBuilder.Finish()

entity = Entity(schema)
entity.Set('Views', v)

获取值:entity.Get[ElementId]('Views')

最佳答案

我认为我在 c# 中使用 AddArrayField 遇到了同样的问题,并且可能做错了什么,但我的快速修复解决方案是简单地使用 AddMapField。

    FieldBuilder mapField_Child_Angle = mySchemaBuilder.AddMapField("FurnLocations_Angle", typeof(ElementId), typeof(double));
    mapField_Child_Angle.SetUnitType(UnitType.UT_Length);

关于revit-api - 使用 RevitPythonShell 的可扩展存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63861112/

相关文章:

python - IronPython WPF 与 RevitPythonShell

python - 如何在 revitpythonshell 中选择正确的 LoadFamily 函数

python - 从 Revit 外部访问 Revit API

revit-api - 如何通过revit API访问所有族类型?

c# - 如何从某个特定文件夹加载 Revit 插件?

revit-api - 如何在Python(Revit Dynamo)中自动处理DialogBoxShowing事件?

revit-api - 使用 Revit API 编码 : tips to reduce memory use?

c# - 如何使用c#获取revit中所有元素的列表

revit-api - 隐藏图纸或 Revit 文档中的图元