使用RevitPythonShell的ExtensibleStorage

问题描述

我正在尝试利用Revit API中的ExtensibleStorage。我试图将一个数组存储在ArrayField中。我认为也许我的错误是由于IronPython接口引起的,但也许有人成功完成了此操作?我知道要设置的对象应该是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',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);
,

这对我有用:

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,123113'})