【问题标题】:ExtensibleStorage using RevitPythonShell使用 RevitPythonShell 的可扩展存储
【发布时间】:2020-12-30 19:21:19
【问题描述】:

我正在尝试利用 Revit API 中的 ExtensibleStorage。我正在尝试将数组存储在 ArrayField 中。我想也许我的错误是由于 IronPython 接口,但也许有人成功地做到了这一点?我知道要设置的对象应该是一个 IList,但我似乎无法制作一个。在 IronPython 文档中,Array-object 被用作示例。如果我尝试这个: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')

【问题讨论】:

    标签: revit-api revitpythonshell pyrevit


    【解决方案1】:

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

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

    【讨论】:

    • 试过了,但我无法在 Ironpython 中创建 IDictionary,所以我遇到了与 AddArrayField 方法相同的问题。
    • 切换到 C# 更快。
    【解决方案2】:

    这对我有用:

    from System import Guid
    from System.Collections.Generic import IDictionary, Dictionary
    from Autodesk.Revit.DB.ExtensibleStorage import *
    
    keyType = str
    valueType = str
    name = 'UserViews'
    schemaBuilder = SchemaBuilder(Guid.NewGuid())
    schemaBuilder.SetReadAccessLevel(AccessLevel.Public)
    schemaBuilder.SetWriteAccessLevel(AccessLevel.Public)
    schemaBuilder.SetSchemaName('Test')
    schemaBuilder.AddMapField(name, keyType, valueType)
    schema = schemaBuilder.Finish()
    ent = Entity(schema)
    dic = Dictionary[str, str]()
    dic.Add('kyrreViews', '234234,121345,123113')
    ent.Set[IDictionary[str, str]](name, dic)
    val = ent.Get[IDictionary[str, str]](name)
    
    >>> val
    Dictionary[str, str]({'kyrreViews' : '234234,121345,123113'})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      相关资源
      最近更新 更多